如何在SELECT查询中为fieldName IN @fieldName构造添加参数

时间:2015-08-13 17:05:17

标签: c# sql sqlcommand

string idVariable = "qwerty";
string sqlQuery = "select id from user where id = @id";
sqlCommand.Parameters.Add("@id", SqlDbType.VarChar).Value = idVariable;

为特定字段添加值即可。

如果我需要在WHERE子句中使用一些ID和IN,该怎么办?

List<string> ids = new List<string>{"qwe", "asd", "zxc"};
string sqlQuery = "select id from user where id IN @ids";
sqlCommand.Parameters.Add("@ids", SqlDbType.???).Value = ids;

3 个答案:

答案 0 :(得分:1)

您无法直接执行此操作,因为Aug 13 08:37:53 518537-web5 simplesamlphp[20692]: 3 [20fd4d449a] SimpleSAML_Error_Error: UNHANDLEDEXCEPTION Aug 13 08:37:53 518537-web5 simplesamlphp[20692]: 3 [20fd4d449a] Backtrace: Aug 13 08:37:53 518537-web5 simplesamlphp[20692]: 3 [20fd4d449a] 0 /var/www/simplesamlphp/www/module.php:180 (N/A) Aug 13 08:37:53 518537-web5 simplesamlphp[20692]: 3 [20fd4d449a] Caused by: SimpleSAML_Error_Exception: Unable to find a certificate matching the configured fingerprint. Candidates: '**********************'; certFingerprint: '************************'. Aug 13 08:37:53 518537-web5 simplesamlphp[20692]: 3 [20fd4d449a] Backtrace: Aug 13 08:37:53 518537-web5 simplesamlphp[20692]: 3 [20fd4d449a] 5 /var/www/simplesamlphp/modules/saml/lib/Message.php:116 (sspmod_saml_Message::findCertificate) Aug 13 08:37:53 518537-web5 simplesamlphp[20692]: 3 [20fd4d449a] 4 /var/www/simplesamlphp/modules/saml/lib/Message.php:165 (sspmod_saml_Message::checkSign) Aug 13 08:37:53 518537-web5 simplesamlphp[20692]: 3 [20fd4d449a] 3 /var/www/simplesamlphp/modules/saml/lib/Message.php:556 (sspmod_saml_Message::processAssertion) Aug 13 08:37:53 518537-web5 simplesamlphp[20692]: 3 [20fd4d449a] 2 /var/www/simplesamlphp/modules/saml/lib/Message.php:528 (sspmod_saml_Message::processResponse) Aug 13 08:37:53 518537-web5 simplesamlphp[20692]: 3 [20fd4d449a] 1 /var/www/simplesamlphp/modules/saml/www/sp/saml2-acs.php:81 (require) Aug 13 08:37:53 518537-web5 simplesamlphp[20692]: 3 [20fd4d449a] 0 /var/www/simplesamlphp/www/module.php:135 (N/A) Aug 13 08:37:53 518537-web5 simplesamlphp[20692]: 3 [20fd4d449a] Error report with id 40d74688 generated. 运算符会触发值列表,而您的参数是包含列表的单个值。

解决这个问题的一种方法是使用表值参数(here is an example),另一种方法是动态创建IN以及查询的参数:

IN

答案 1 :(得分:0)

您需要单独添加它们。

List<string> ids = new List<string>{"qwe", "asd", "zxc"};
string sqlQuery = "select id from user where id IN (@id1, @id2, @id3)";

sqlCommand.Parameters.Add("@id1", SqlDbType.VarChar).Value = ids[0];
sqlCommand.Parameters.Add("@id2", SqlDbType.VarChar).Value = ids[1];
sqlCommand.Parameters.Add("@id3", SqlDbType.VarChar).Value = ids[2];

答案 2 :(得分:0)

是的,您无法动态更改查询的性质。您可以使用固定数量的选项编写一个in并将它们作为参数添加,或者您可以动态构建SQL字符串本身以添加@id参数的数量和它的值。由于您已经在为命令使用SQL字符串,因此这种动态SQL不是问题。如果你使用的是存储过程,那就不那么容易了,但你可以使用带有一堆可选参数的存储过程,然后只传递你需要的数量。当然,您也可以使用Entity Framework和LINQ来构建查询逻辑,并让LINQ to EF的提供程序构建原始SQL查询。