2014-11-01 51 views
3

此查询有效;也就是说,它返回预期的结果:dapper查询 - 修复“未接受引号附近...”错误

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

但是,如果“名称”值中的一个包含apostrophy(这是真的),然后抛出一个异常“{“附近有语法错误‘资源’。 \ 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); 

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

回答

5

使用参数是正确的选择。你绝对是不要想要把值放入查询本身,就像你在第一个代码段中做的那样。但是,您已将@name放在引号中,这意味着它被视为字符串文字...它正在查找名称值为@name,而不是@name参数的值。你想:

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

(这可能传递参数的最简单的方法,但其他方法应太)

现在我还没有实际使用小巧玲珑的自己,但是这就是我'd expect ...

+0

这正是我在阅读最初发布的答案后最终做的事!我知道它必须是一些微不足道的东西 - 我没有意识到将'@ name'放在单引号中会强制它被视为字符串文字。谢谢。 – Bret 2014-11-01 19:55:27

+4

当一个图书馆的非用户期望的确是API的工作方式时,它让我满意。这表明我们做对了。 – 2014-11-01 20:26:54

相关问题