我正在尝试使用Informix通过ODBC进行参数化查询,但任何添加参数的尝试都会失败并出现此异常:
$exception {"ERROR [42000] [Informix .NET provider][Informix]A syntax error has occurred."} System.Exception {IBM.Data.Informix.IfxException}
以下是失败的代码:
List<ItemAttribute> items = con.Query<ItemAttribute>("select * from oe_cnvwrk where cwr_genero = @cwr_genero", new{cwr_genero = cwr_genero}).ToList();
在没有参数的情况下使用它,就像这个例子一样,可以完美地工作,但是可以打开应用程序直到注入攻击:
ItemHeader itemHeader = con.Query<ItemHeader>("select * from oe_cnvhdr where hdr_control_id = " + hdr_control_id).Single();
我能够在这里找到一个关于这个完全相同问题的先前列出的问题,但它从未被回答过。我希望有人知道如何处理这个问题:Dapper not adding parameters
任何想法都可以解决这个问题,或者是否有一种不同的方法来处理可能有用的Dapper参数化?
答案 0 :(得分:5)
尚未发布到NuGet,但source code现在包含对伪位置参数的支持。这些是通过模式识别实现的,因此文本中的?abc?
映射到名为abc
的成员参数,但使用位置?
语法。所以如果你发出:
List<ItemAttribute> items = con.Query<ItemAttribute>(
"select * from oe_cnvwrk where cwr_genero = ?cwr_genero?",
new{cwr_genero = cwr_genero}).ToList();
它应该工作;执行的实际查询是:
select * from oe_cnvwrk where cwr_genero = ?
其中添加的参数是标记为cwr_genero
的成员中的参数。这允许正确解析成员。特殊?foo?
模式用作切换到位置参数的指示符。
请注意,每个查询只能引用一次个别参数;以下不工作:
select * from sometable where foo = ?x? or bar = ?x?