使用Informix和Dapper向查询添加参数失败,出现语法异常
本文关键字:失败 异常 语法 参数 添加 Informix Dapper 查询 使用 | 更新日期: 2023-09-27 18:21:52
我正试图通过ODBC对Informix使用参数化查询,但任何添加参数的尝试都失败了,出现了以下异常:
$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不添加参数
有什么想法可以解决这个问题,或者有没有一种不同的方法可以用Dapper处理参数化?
尚未发布到NuGet,但源代码现在包含对伪位置参数的支持。这些都是通过模式识别实现的,因此文本中的?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 = ?
其中添加的参数是来自标记为CCD_ 7的成员的参数。这样可以正确解析成员。特殊的?foo?
模式被用作切换到位置参数的指示符。
请注意,每个查询只能引用一次单个参数;以下将无效:
select * from sometable where foo = ?x? or bar = ?x?