代码之家  ›  专栏  ›  技术社区  ›  Aleksa Ristic

错误:不支持表达式求值

  •  1
  • Aleksa Ristic  · 技术社区  · 6 年前

    我只想简单地将数据库中的列值增加1,但是我总是得到 expression evaluation not supported 错误/

    这是我正在使用的查询:

    UPDATE SISTEMSKA_OGRANICENJA SET TRENUTNO = ((SELECT N.TRENUTNO FROM 
    SISTEMSKA_OGRANICENJA N WHERE N.KORISNIKID = @KorisnikID AND N.OGRANICENJE = 
    @Ogranicenje) + 1) WHERE KORISNIKID = @KOrisnikID 
    AND OGRANICENJE = @Ogranicenje
    

    我也尝试过在select语句中不声明n,但它仍然不起作用。

    我也尝试过

    UPDATE SISTEMSKA_OGRANICENJA SET TRENUTNO = TRENUTNO + 1) WHERE KORISNIKID 
    = @KOrisnikID AND OGRANICENJE = @Ogranicenje
    

    我知道问题是什么,菲尔德 TRENUTNO 是类型 Varchar . 我怎么能把它转换成 int 添加1,然后返回到 varchar 一次查询?我知道怎么用两个,但速度会慢一些。

    暂时,我已经在两个查询中完成了如下操作:

    public static void UvecajTrenutno(Ogranicenja ogranicenje, int korisnikId)
    {
        using (FbConnection con = new FbConnection(M.Baza.connectionString))
        {
            int trenutno = -1;
            con.Open();
            using (FbCommand cmd = new FbCommand("SELECT TRENUTNO FROM SISTEMSKA_OGRANICENJA WHERE KORISNIKID = @KorisnikID AND OGRANICENJE = @Ogranicenje", con))
            {
                cmd.Parameters.AddWithValue("@KorisnikID", korisnikId);
                cmd.Parameters.AddWithValue("@Ogranicenje", ogranicenje);
    
                FbDataReader dr = cmd.ExecuteReader();
    
                if(dr.Read())
                {
                    trenutno = Convert.ToInt32(dr[0]);
                }
            }
            if(trenutno < 0)
            {
                MessageBox.Show("Doslo je do greske! - Korisnik.Ogranicenje.UvecajTrenutno");
                return;
            }
            using (FbCommand cmd = new FbCommand("UPDATE SISTEMSKA_OGRANICENJA SET TRENUTNO = @TR WHERE KORISNIKID = @KorisnikID AND OGRANICENJE = @Ogranicenje", con))
            {
                cmd.Parameters.AddWithValue("@KorisnikID", korisnikId);
                cmd.Parameters.AddWithValue("@Ogranicenje", ogranicenje);
                cmd.Parameters.AddWithValue("@TR", trenutno + 1);
    
                cmd.ExecuteNonQuery();
            }
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Mark Rotteveel    6 年前

    您需要将更新语句更改为:

    UPDATE SISTEMSKA_OGRANICENJA 
        SET TRENUTNO = (cast(TRENUTNO as integer) + 1)
        WHERE KORISNIKID = @KOrisnikID AND OGRANICENJE = @Ogranicenje
    

    IIRC正确(现在无法检查)这应该自动强制返回到VARCHAR,否则将其更改为

    UPDATE SISTEMSKA_OGRANICENJA 
        SET TRENUTNO = cast(cast(TRENUTNO as integer) + 1 as varchar(20))
        WHERE KORISNIKID = @KOrisnikID AND OGRANICENJE = @Ogranicenje
    

    然而,正如我在评论中指出的,如果 TRENUTNO 应该是一个数值,如果打算这样操作(就像现在这样),那么最好将此列更改为数值(integer、bigint等)而不是字符串类型。这才是解决你问题的真正办法。

    如果 特伦图诺 包含无法转换为整数的值。

    一个小小的警告:我现在无法访问firebird安装程序,我将在今天晚些时候验证我的答案。