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