DB2 - 使用带有字符串数组参数的 Dapper 选择查询将不会返回正确的结果
Posted
技术标签:
【中文标题】DB2 - 使用带有字符串数组参数的 Dapper 选择查询将不会返回正确的结果【英文标题】:DB2 - Select query using Dapper with String Array parameter will not return correct results 【发布时间】:2020-11-20 22:19:49 【问题描述】:我对使用 DB2、Dapper、IN 子句的 Select 查询有疑问。 我正在尝试将字符串数组传递给查询。查询本身工作正常,但查询仅从数组中获取第一个值,即(sudo 代码,因为我将在 C# 代码中使用它)
Select col1, col1, col3 from schema.tblName
Where col1 = ? AND col2 IN (?)
现在,关于设置的更多上下文,在 MSSQL 和 DB2 中使用 Dapper 进行查询是有区别的。 我的 DB2 设置为仅采用基于位置的参数,所以?代替参数(我无法控制),我不能使用命名参数。
在 C# 中我尝试过这样的事情:
var parameters = new "1", new[]"1000","2000";
var results = conn.Query<dynamic>(aboveSql, paramers);
所有这些都可以正常运行、编译和运行。但是查询不会返回第二个字符串数组值的值(这是 Select 语句的 IN 子句)。 它只会返回字符串数组的第一个值的结果。
我已经做了一些广泛的研究,试图应用不同的技术,下面的链接也是如此 https://huorswords.github.io/dapper/parameters/sql/in/2019/07/16/dapper-avoid-parentheses-IN-clause.html (请记住,上面的链接是针对 MSSQL 而不是 DB2)。
尝试更改查询,删除括号不行。
尝试将参数类型从 String[] 更改为 List 或 IEnumerable - 仍然不行。 我检查了 Dapper 文档 - 他们所说的所有 IN 子句都受支持。
任何人都知道如何在 DB2 中将 IN 子句与 Array 参数一起使用,并且可以提出解决方案,我将不胜感激。
谢谢
【问题讨论】:
对于 Db2 CLI 应用程序,IN 列表的每个成员在当 Db2 编译查询时的查询中必须有自己的参数标记。由于您的查询只有一个参数标记,因此只有第一个数组条目被绑定。 嗨@mao,首先感谢您抽出宝贵时间阅读和回复帖子,非常感谢。由于 IN 子句中的值是动态的,我将不得不动态设置定位参数,即问号占位符。我将在星期一对此进行测试并更新。这实际上是有道理的,因为代码不会中断或抛出任何错误。只返回 IN 子句中第一个值的结果。 @mao,只是为了确认。您的解释,绝对是代码编译但仅从字符串数组中获取第一个参数的原因。我已经硬编码 ... IN (?,?) - 匹配字符串数组中的值的数量并得到正确的结果。不幸的是,这意味着我必须找到一种方法来动态更改查询以包含可变数量的 ?在 IN 子句中。 【参考方案1】:根据this页面,可以使用伪位置参数。
看起来像这样:
string sql = "SELECT col1, col1, col3 from schema.tblName WHERE col1 = ?param1? AND col2 IN ?param2?";
var results = conn.Query<dynamic>(sql, new param1 = "1", param2 = new[]"1000","2000");
?param1?将被 ?并且param1
成员将作为位置参数插入,param2 也是如此。
EDIT:删除了 IN 表达式周围的括号。它们应该由 Dapper 插入。
【讨论】:
嗨@Palle Due,感谢您的建议和链接。我已经测试了可能的修复。将查询更改为建议时出现错误:找到了意外的令牌。预期的令牌可能包括: AT MICROSECOND SECOND SECOND MINUTES MINUTE HOURS。 SQLSTATE: 42601, SQLCODE: -104 (当我听从你的建议时 - 括号括起来?param2?) 并且 EXECUTE 或 OPEN 语句中的主机变量的数量不等于所需的值的数量。 SQLSTATE: 07001, SQLCODE: -313 (当我遵循链接中的建议时 - ?param2 周围没有括号?) @Kriss2:很抱歉。 IN 列表周围绝对不应该有括号。我已经编辑了答案。 别担心。您的答案实际上是正确的。您提供的链接将我指向该站点:dapper.programmingpedia.net/en/tutorial/10/… 最后,我的查询需要如下所示: string sql = "SELECT col1, col1, col3 from schema.tblName WHERE col1 = ? AND col2 IN ?param2?";我试图支持你的帖子,但我不允许:(以上是关于DB2 - 使用带有字符串数组参数的 Dapper 选择查询将不会返回正确的结果的主要内容,如果未能解决你的问题,请参考以下文章
Dapper use Table Value Parameter in C# (Sql Server 数组参数)