如何通过 Dapper 使用 Oracle 的整数参数列表?

jol*_*r23 4 c# sql oracle sqlparameter dapper

我正在尝试重新编写一些代码以使用 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;
}
Run Code Online (Sandbox Code Playgroud)

在使用 Dapper 之前,执行语句运行得很好。现在我收到以下错误:

ORA-00936: 缺少表达式。

我当前的解决方案基于以下帖子:

带有参数列表的 Dapper 查询以及 使用 Dapper 执行插入和更新

Ami*_*shi 9

我不确定这是否是 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;
}
Run Code Online (Sandbox Code Playgroud)

有以下区别:

  1. 使用“ :ids”代替“ @ids。我强烈怀疑这是一个问题,因为 Oracle 需要:而不是@参数。
  2. 使用int[]代替List<int>. 这应该不是问题,因为 Dapper支持 IEnumerable参数列表;所以List应该没问题。您已经尝试过此操作(正如您在评论中提到的)但没有成功。

请参阅问题以了解使用参数列表的 Dapper withIN子句。这是另一个资源。

编辑(供评论):

问题的核心是使用“ :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;
}
Run Code Online (Sandbox Code Playgroud)