当我使用参数运行查询或命令时,为什么Dapper会抛出OracleException异常?

27
我在评估Dapper,但已经遇到了一些问题。
我正在尝试做这件事。
using (IDbConnection connection = GetConnection())
{
    connection.Open();
    var result = connection.Query(
        "select * from myTable where ID_PK = @a;", new { a = 1 });
}

在SqlMapper.cs的第393行,它会抛出一个ORA-00936:缺少表达式OracleException。

using (var reader = cmd.ExecuteReader())
当我移除参数时,我会将整个表格放入结果变量中。
查询在sqldeveloper中没有问题。我正在使用Oracle.DataAccess Assembly 2.112.2.0。

9
我认为Oracle对命名参数有不同的模式,你尝试过使用 :a 而不是 @a 吗? - Bernhard Kircher
这是Dapper中命名参数的模式。Dapper应该处理不同的RDBMS模式。 - mrt181
2
好的,我认为Dapper只是使用Ado.Net,由于查询是字符串,因此参数的格式很重要。由于我似乎没有足够的知识,最后一个提示: https://dev59.com/AW025IYBdhLWcg3wHR8Y 提到了与Oracle参数相关的问题(现在应该已经解决了),也许您可以检查一下。祝好运。 - Bernhard Kircher
好的,我很蠢。Bernhard,你是绝对正确的,它必须是:a。请将您的第一个评论作为被接受的答案输入。m( - mrt181
2
既然我的评论似乎有所帮助,给我点个赞就好了。 - Bernhard Kircher
@Bernard,请将您的评论发布为答案,这样我们就可以结束这个循环了。 - Sam Saffron
3个回答

56

我认为 Oracle 在命名参数方面有不同的模式,你试过使用 :a 而不是 @a 吗?


对我而言,这不是一个可接受的答案。我需要Dapper / Dapper.Contrib能够普遍地与Sql Server和Oracle一起工作。在这里,Contrib是最糟糕的罪犯,因为我无法控制语句中的绑定参数。@/:字符应由Dapper管理。支持Oracle时这是一个很好的回答,为此我给该帖子点了赞。 - Mark Longmire

7

是的,如果我们试图向Oracle数据库表中插入记录,它可以使用“:”。

只需尝试这样做:

var count = connection.Execute(@"INSERT INTO COMPANY_USER(UserId , UserName) values (:UserId, :UserName)", new[] { new { UserId = 1, UserName = "Sam" }, new { UserId = 2, UserName = "Don" }, new { UserId = 3, UserName = "Mike" } });

3

它还可与IN列表一起使用:

var partialList = new List();

var list = await db.QueryAsync("select bla1, blah2 FROM tablename WHERE stringcolumn1 IN :ListofValues", new { ListofValues = partialList });


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接