我正在尝试重写一些代码以使用Dapper,因此我可以轻松使用参数。我试图在Oracle数据库上执行UPDATE语句。 IDs
到UPDATE的列表作为参数传递为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:缺少表达。
我目前的解决方案基于以下帖子:
Dapper query with list of parameters和 Performing Inserts and Updates with Dapper
答案 0 :(得分:1)
我不确定这是否是Oracle特定问题,因为我从未使用过Oracle + Dapper组合。但我强烈怀疑你传递参数的方式是一个问题。例外&#34;缺少表达&#34;是说同样的话。
请参阅以下代码的修改:
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
&#34;而不是&#34; @ids
&#34; 。我强烈怀疑这是一个问题,因为Oracle希望:
代替@
参数。int[]
代替List<int>
。这应该不是问题,因为Dapper supports IEnumerable
用于参数列表;所以List
应该没问题。您已经尝试过这个(正如您在评论中提到的那样)但没有成功。使用参数列表,使用IN
子句为Dapper引用this问题。这是another资源。
问题的核心是使用&#34; :ids
&#34;这正确地包含在我的答案中。我刚刚纠正了上面代码中的语法错误。
另外,我通常使用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;
}
答案 1 :(得分:1)
根据阿米特的回答,下面是我最终的工作。我必须使用匿名对象包装传入的集合。
connection.Execute("UPDATE TABLE SET PROCESSED_COUNT = PROCESSED_COUNT+ 1 WHERE ID IN :ids",
new { ids });
答案 2 :(得分:0)
我不认识Dapper(从来没有听说过),所以如果这是胡说八道,我会道歉。但是,在这:
WHERE ID IN @ids
IN
表明Oracle期望括在括号中的元素列表。那么,@ids
究竟是什么?如果它是单个值,则括号不是必需的。但是,如果它们中有两个或更多(尽管最多1000个),它们必须用逗号分隔,并且 - 如我所说 - 括在括号中,例如(1, 2, 8)
。我想你已经将它们分开了 - 现在尝试添加()
并看看会发生什么。