C# 错误:不支持表达式计算

C# 错误:不支持表达式计算,c#,sql,firebird,C#,Sql,Firebird,我只想将数据库中的列值增加1,但我总是得到表达式求值不受支持错误/ 这是我正在使用的查询: 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 O

我只想将数据库中的列值增加1,但我总是得到
表达式求值不受支持
错误/

这是我正在使用的查询:

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
add1,然后返回到
varchar
all-in-one查询?我知道如何用两个,但速度会慢一些

暂时,我已经在两个查询中这样做了:

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();
        }
    }
}
public static void UvecajTrenutno(Ogranicenja ogranicenje,int korisnikId)
{
使用(FbConnection con=新FbConnection(M.Baza.connectionString))
{
int trenutno=-1;
con.Open();
使用(FbCommand cmd=new FbCommand(“从SISTEMSKA_OGRANICENJA中选择TRENUTNO,其中KORISNIKID=@KORISNIKID和OGRANICENJE=@OGRANICENJE”,con))
{
cmd.Parameters.AddWithValue(“@KorisnikID”,KorisnikID);
cmd.Parameters.AddWithValue(“@Ogranicenje”,Ogranicenje);
FbDataReader dr=cmd.ExecuteReader();
if(dr.Read())
{
trenutno=转换为32(dr[0]);
}
}
如果(trenutno<0)
{
MessageBox.Show(“Doslo je do greske!-Korisnik.Ogranicenje.UvecajTrenutno”);
返回;
}
使用(FbCommand cmd=new FbCommand(“更新SISTEMSKA_OGRANICENJA SET TRENUTNO=@TR其中KORISNIKID=@KORISNIKID和OGRANICENJE=@OGRANICENJE”,con))
{
cmd.Parameters.AddWithValue(“@KorisnikID”,KorisnikID);
cmd.Parameters.AddWithValue(“@Ogranicenje”,Ogranicenje);
cmd.Parameters.AddWithValue(“@TR”,trenutno+1);
cmd.ExecuteNonQuery();
}
}
}

您需要将update语句更改为:

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
被认为是一个数值,并且如果它是这样被操作的(就像你现在所做的那样),那么最好将此列更改为一个数值(整数、bigint等),而不是字符串类型。这将是你问题的真正解决办法

如果
TRENUTNO
包含无法转换为整数的值,则使用强制转换的解决方案将很难失败


小小的警告:我现在没有访问Firebird安装的权限,我今天晚些时候会验证我的答案。

您是否尝试过将TRENUTNO转换为数值,然后添加1,然后再转换回varchar?没有,因为我不知道如何在查询中执行此操作。我用两个临时查询完成了它。
@namedoparameters
可能在Driver中实现,也可能不实现。为什么这个列首先是一个varchar?您不能更改数据库设计,使此列为整数或bigint吗?顺便说一句:您不需要使用复杂的嵌套select。它应该是
varchar
,因为我在其中存储了多个不同的值,并且我知道这个问题。谢谢。@AleksaRistic在一列中存储多个值已经是一种设计风格,当该列中有多个值时,此解决方案将不起作用。考虑规范数据库设计:即用一个外键为这个表创建一个单独的多个值表。我知道这一点,而且我处理得很好。该表总共有大约100行,除了
TRENUTNO
列之外,还有
TYPE
列,该列的值只有1、2、3,其中TYPE是
1-TRENUTNO是TYPE of int;2-TRENUTNO是字符串的类型…
..@AleksaRistic No,那么
TRENUTNO
将保持为null,因为null+1为null。我可以使用
合并(强制转换(TRENUTNO为整数),0)