使用带字符串数组参数的Dapper的DB2-Select查询将不会返回正确的结果

使用带字符串数组参数的Dapper的DB2-Select查询将不会返回正确的结果,db2,dapper,Db2,Dapper,我对使用以下语句的Select查询有一个问题:DB2,Dapper,IN子句。 我试图将字符串数组传递给查询。查询本身工作正常,但查询只从数组中拾取第一个值,即sudo代码,因为我将在C代码中使用它 Select col1, col1, col3 from schema.tblName Where col1 = ? AND col2 IN (?) 现在,再了解一下有关设置的上下文,在MSSQL和DB2中使用Dapper进行查询是有区别的。 我的DB2设置为只接受基于位置的参数,那么?我无法控

我对使用以下语句的Select查询有一个问题:DB2,Dapper,IN子句。 我试图将字符串数组传递给查询。查询本身工作正常,但查询只从数组中拾取第一个值,即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子句。 它将只返回字符串数组的第一个值的结果

我已经做了一些广泛的研究,试图应用不同的技术,下面的链接也是如此 请记住,上面的链接是针对MSSQL的,而不是针对DB2的

已尝试更改查询,请删除括号,然后重试

已尝试将参数类型从字符串[]{}更改为列表或IEnumerable-仍然无效。 我查看了简洁的文档,他们在子句中所说的一切都得到了支持

如果有人知道如何在DB2中使用带有数组参数的IN子句,并能提出解决方案,我将不胜感激

谢谢

根据第页,您可以使用伪位置参数

它看起来像这样:

var parameters = new {"1", new[]{"1000","2000"}};
var results = conn.Query<dynamic>(aboveSql, paramers);
字符串sql=从schema.tblName中选择col1、col1、col3,其中col1=?param1?和col2 IN?param2?; var results=conn.Querysql,new{param1=1,param2=new[]{10002000}; 那个?param1?将被替换为?并且param1成员将作为位置参数插入,param2也是如此


编辑:删除了IN表达式周围的括号。它们应该由Dapper插入。

对于Db2 CLI应用程序,在Db2编译查询时,IN列表的每个成员在查询中都必须有自己的参数标记。由于您的查询只有一个参数标记,因此只有第一个数组条目被绑定。您好@mao,首先感谢您花时间阅读并回复本文,非常感谢。由于in子句中的值是动态的,因此我必须动态设置定位参数,即问号占位符。我会在周一测试并更新。它实际上是有意义的,因为代码不会中断或出现任何错误。只返回in子句中第一个值的结果。@mao,只是确认一下。您的解释肯定是代码编译但只从字符串数组中获取第一个参数的原因。我已经硬编码了。。。在?,?-匹配字符串数组中的值数并得到正确的结果。不幸的是,这意味着我必须找到一种方法来动态更改查询,以包含可变数量的?在in子句中。Hi@Palle Due,感谢您的建议和链接。我已经测试了可能的修复方法。将查询更改为“建议”时出错:找到了意外标记。预期令牌可能包括:微秒、微秒、秒、分、时。SQLSTATE:42601,SQLCODE:-104当我按照你的建议时-括号在?param2?EXECUTE或OPEN语句中的主机变量数量不等于所需的值数量。SQLSTATE:07001,SQLCODE:-313当我遵循链接的建议时-在?param2?周围没有括号?@kris2:很抱歉。列表中绝对不应该有括号。我已经编辑了答案,别担心。你的答案其实很准确。您提供的链接将我指向此站点:最终,我的查询需要如下所示:string sql=SELECT col1,col1,col3 from schema.tblName,其中col1=?和col2 IN?param2?;我试图提升你的职位,但我不被允许: