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

Posted

技术标签:

【中文标题】使用 Informix 和 Dapper 向查询添加参数失败并出现语法异常【英文标题】:Adding parameters to a query with Informix and Dapper fails with syntax exception 【发布时间】:2014-09-15 13:55:20 【问题描述】:

我正在尝试通过 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", newcwr_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 处理参数化?

【问题讨论】:

呃,你确定 ODBC 支持 @parametername 语法吗? 从内存来看,Informix 只支持顺序的? 参数,不支持命名参数。 Dapper 目前对此没有很好的支持,尽管我想改进它。实际上,我拥有执行此操作所需的大部分代码,因为我一直在研究 dapper 的 java 端口,而 jdbc 没有命名参数的概念。我愿意考虑通过“使用位置参数”标志或类似的方式将这些更改合并到 dapper 中。想法? 那当然很棒。这会打开通往 OleDb 提供者的道路吗? (比如......咳咳......访问?) @Steve 大概是的 这将非常有用,是的,马克! 【参考方案1】:

尚未发布到 NuGet,但 source code 现在包含对伪位置参数的支持。这些是通过模式识别实现的,因此您的文本中的?abc? 映射到从成员abc 命名的参数,但使用位置? 语法。所以如果你发出:

List<ItemAttribute> items = con.Query<ItemAttribute>(
    "select * from oe_cnvwrk where cwr_genero = ?cwr_genero?",
    newcwr_genero = cwr_genero).ToList();

它应该可以工作;执行的实际查询是:

select * from oe_cnvwrk where cwr_genero = ?

其中添加的参数是来自标记为cwr_genero 的成员的参数。这允许正确解析成员。特殊的?foo? 模式用作切换到位置参数的指标。

请注意,每个查询只能引用单个参数一次;以下将工作:

select * from sometable where foo = ?x? or bar = ?x?

【讨论】:

意味着我们不能多次使用同一个参数 (?a?)。我正在使用甲骨文 我使用了 :a 而不是 ?a?会好吗? @user960567 :a 不是位置选项 - 这是命名的 - 所以是的,命名参数应该可以正常工作。如果没有,请告诉我 甚至 :a 显示相同的错误我现在已经创建了 2 个变量

以上是关于使用 Informix 和 Dapper 向查询添加参数失败并出现语法异常的主要内容,如果未能解决你的问题,请参考以下文章

Dapper-小型ORM之王(C#.NET)

MySQL:如何在查询中向日期时间字段添加一天

在 Informix 中使用 ANSI OUTER JOIN 和 OUTER 时查询计划的差异

使用 SQL 查询查找 Informix 表和列详细信息

在 Dapper 和实体框架中处理对象的方式有啥区别 - 使用原始 SQL 查询?

我想使用 dapper 在 Oracle 和 SQL 数据库上执行参数化查询