使用Informix和Dapper向查询添加参数失败,并出现语法异常

时间:2014-09-15 13:55:20

标签: c# asp.net-mvc informix dapper

我正在尝试使用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参数化?

1 个答案:

答案 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?