我正在尝试重新编写一些代码来使用 Dapper,这样我就可以轻松地使用参数。我正在尝试在 Oracle 数据库上执行 UPDATE 语句。 IDs
列表更新作为 List<int>
传入作为参数。我想为每个 IDs
更新一个字段传入。下面是我的:
OracleConnection connection = ... // set earlier
public int IncreaseProcessCount(List<int> ids)
{
var rowsAffected = connection.Execute(@"UPDATE TABLE SET PROCESSED_COUNT = PROCESSED_COUNT + 1 WHERE ID IN @ids", new { ids });
return rowsAffected;
}
在使用 Dapper 之前,执行语句工作得很好。现在我收到以下错误:
ORA-00936: missing expression.
我当前的解决方案基于以下帖子:
Dapper query with list of parameters和 Performing Inserts and Updates with Dapper
最佳答案
我不确定这是否是 Oracle 特有的问题,因为我从未使用过 Oracle + Dapper 组合。但我强烈怀疑你传递参数的方式有问题。异常“缺少表达式”说的是同一件事。
引用下面的代码修改:
public int IncreaseProcessCount(int[] ids)
{
var rowsAffected = connection.Execute(@"UPDATE TABLE SET PROCESSED_COUNT = PROCESSED_COUNT + 1 WHERE ID IN :ids", new { ids });
return rowsAffected;
}
有以下区别:
- 使用“
:ids
”代替“@ids
”。我强烈怀疑这是一个问题,因为 Oracle 期望:
而不是@
参数。 - 使用
int[]
而不是List<int>
.这应该不是问题,因为 Dapper supportsIEnumerable
对于参数列表;所以List
应该可以。你已经尝试过这个(正如你在评论中提到的)但没有成功。
引用this关于 IN
的 Dapper 问题使用参数列表的子句。这是 another资源。
编辑(评论):
问题的核心是使用“:ids
”,它已正确包含在我的回答中。我刚刚更正了上面代码中的语法错误。
此外,我通常使用 DynamicParameters
.实际上,在这种情况下这不是问题,所以我删除了第一版答案中出现的那部分。无论如何,以下是带有 DynamicParameters
的代码这应该同样有效。
public int IncreaseProcessCount(int[] ids)
{
var param = new DynamicParameters();
param.Add(":ids", ids);
var rowsAffected = connection.Execute(@"UPDATE TABLE SET PROCESSED_COUNT = PROCESSED_COUNT + 1 WHERE ID IN :ids", param);
return rowsAffected;
}
关于c# - 如何使用 Dapper 的 Oracle 整数参数列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48571835/