【发布时间】:2021-02-25 14:14:18
【问题描述】:
我想更新由 ID 列表给出的行列表。通常,查询的参数可以通过参数属性传递。但如果我传递一个 ID 列表,Firebird 将不接受该查询。我正在使用 NuGet 的 FirebirdSql.Data.FirebirdClient。
代码(简化):
List<string> ids = someList.Select(_ => _.Id).ToList();
using (var fbCommand = new FbCommand("UPDATE someTable SET NAME='foo' WHERE ID IN (@ids)", fbConnection))
{
fbCommand.Parameters.Add("ids", ids);
fbCommand.ExecuteNonQuery();
}
表“someTable”的定义如下:
CREATE TABLE someTable (
ID CHAR(36),
NAME CHAR(20)
);
这是个例外:
抛出异常:FirebirdSql.Data.FirebirdClient.dll 中的“FirebirdSql.Data.FirebirdClient.FbException” “FirebirdSql.Data.FirebirdClient.FbException”类型的异常发生在 >FirebirdSql.Data.FirebirdClient.dll 中,但未在用户代码中处理 算术异常、数值溢出或字符串截断 字符串右截断
【问题讨论】:
-
修复:fbCommand.Parameters.Add("@ids", ids);
-
我仍然使用“@ids”作为参数名得到同样的异常...
-
数据库中的 ID 最大长度为 36 个字符。 c#中的ID是否超过36个字符?
-
有一些技巧,但一般来说参数不是标量,不是值。您的 ID 是否只有整数而不是其他?
-
@Miamy True,您可以像
where ID IN (@Param1, @Param2, @Param3, @Param4)一样对其进行参数化。事实上,你可以有很多参数。但是每个参数都是一个标量值。同样在 C+ 中,您可以使用int i1=1, i2=2, i3=3, i4=4;,但它不是一个变量持有四个数字,而是四个变量每个持有一个数字。与参数相同。没有文本到文本的翻译,没有“字符串拼接”或“搅拌插值”或者叫什么。确实存在变量的创建并将值放入 SQL 查询文本之外的变量中。这就是意图!
标签: c# firebird firebird-.net-provider