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

时间:2018-02-01 21:14:33

标签: c# sql oracle dapper sqlparameter

我正在尝试重写一些代码以使用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 parametersPerforming Inserts and Updates with Dapper

3 个答案:

答案 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;
}

存在以下差异:

  1. 使用&#34; :ids&#34;而不是&#34; @ids&#34; 。我强烈怀疑这是一个问题,因为Oracle希望:代替@参数。
  2. 使用int[]代替List<int>。这应该不是问题,因为Dapper supports IEnumerable用于参数列表;所以List应该没问题。您已经尝试过这个(正如您在评论中提到的那样)但没有成功。
  3. 使用参数列表,使用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)。我想你已经将它们分开了 - 现在尝试添加()并看看会发生什么。