【问题标题】:dapper query - fix for "Unclosed quotation mark near ..." errordapper 查询 - 修复“...附近的未闭合引号”错误
【发布时间】:2014-11-02 03:48:59
【问题描述】:

这个查询有效;也就是说,它返回了预期的结果:

var r = sql.Query<T>("select * from TableName where Name = '" + name + "'");

但是,如果 'names' 值之一包含撇号(这是真的),则会引发异常 '{"Incorrect syntax near 'Resources'。\r\n字符串 '' 后面的引号不正确。 "}' - 为了尝试fix that problem,我的查询不再返回任何结果;但它应该。

我已尝试以几种方式更改代码,但以下任一更改均未返回任何结果:

var r = sql.Query<T>("select * from TableName where Name = '@name'", new { name });

var args = new DynamicParameters(name);
var r = sql.Query<T>("select * from TableName where Name = '@name'", args);

var args = new DynamicParameters(); args.AddDynamicParams(new { name });
var r = sql.Query<T>("select * from TableName where Name = '@name'", args);

var args = new DynamicParameters(); args.Add("@name", name);
var r = sql.Query<T>("select * from TableName where Name = '@name'", args);

这可能是一些微不足道的事情,我只是还没有掌握这个概念......但我已经花了太多时间试图弄清楚 - 因此问题。

【问题讨论】:

    标签: c# dapper


    【解决方案1】:

    使用参数是正确的方法。您绝对想像在第一个 sn-p 中那样将值放入查询本身。但是,您已将@name 放在引号中,这意味着它被视为字符串文字......它正在寻找一个恰好为@name 的名称值,而不是@name 参数的值。你想要:

    var r = sql.Query<T>("select * from TableName where Name = @name", new { name });
    

    (这可能是传递参数的最简单方法,尽管其他方法也应该可以。)

    现在我自己并没有真正使用 Dapper,但这正是我所期望的......

    【讨论】:

    • 这正是我在阅读您最初发布的答案后最终所做的!我知道它必须是微不足道的 - 我没有意识到将 @name 放在单引号中会迫使它被视为字符串文字。谢谢。
    • 当一个库的非用户期望确实正是 API 的工作原理时,我很高兴。这表明我们做对了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多