使用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处理参数化?

使用Informix和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?