【问题标题】:Add list of IDs as parameter for Firebird query in C# [duplicate]在 C# 中添加 ID 列表作为 Firebird 查询的参数 [重复]
【发布时间】: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


【解决方案1】:

我通过简单地使用 foreach 循环来更新所有行来解决这个问题:

List<string> ids = someList.Select(_ => _.Id).ToList();
foreach (string id in ids) {
    using (var fbCommand = new FbCommand("UPDATE someTable SET NAME='foo' WHERE ID = @id", fbConnection))
    {
        fbCommand.Parameters.Add("id", id);
        fbCommand.ExecuteNonQuery();
    }
}

【讨论】:

  • 结构错误:查询是循环不变的。 using 应该在 for 之外而不是在里面。创建查询、添加参数和准备查询(用 SQL 术语“编译”它)应该在循环之前完成。然后在循环内你必须改变参数值并执行之前准备好的查询。
猜你喜欢
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多