使用 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 向查询添加参数失败并出现语法异常的主要内容,如果未能解决你的问题,请参考以下文章
在 Informix 中使用 ANSI OUTER JOIN 和 OUTER 时查询计划的差异