C# 字符串列表问题的.Net SQL参数

C# 字符串列表问题的.Net SQL参数,c#,.net,sql,sql-server,tsql,C#,.net,Sql,Sql Server,Tsql,可能重复: 我正在编写一个C#程序,在该程序中,我向SQL Server发送一个查询以进行处理,并返回一个数据集。在将查询发送到SQL server之前,我使用参数将信息传递给查询。除以下情况外,此操作正常 查询如下所示: reportQuery = " Select * From tableName Where Account_Number in (@AccountNum); and Account_Date = @AccountDate "; Select * From tableNa

可能重复:

我正在编写一个C#程序,在该程序中,我向SQL Server发送一个查询以进行处理,并返回一个数据集。在将查询发送到SQL server之前,我使用参数将信息传递给查询。除以下情况外,此操作正常

查询如下所示:

reportQuery = 
"
Select *
From tableName
Where Account_Number in (@AccountNum);
and Account_Date = @AccountDate
";
Select *
From tableName
Where Account_Number in ('AX3456','YZYL123','ZZZ123');
and Account_Date = '1-Jan-2010'
AccountDate参数用于查找,但不用于AccountNum参数

SqlParameter AccountNumsParam = new SqlParameter();
AccountNumsParam.ParameterName = "@AccountNums";
AccountNumsParam.SqlDbType = SqlDbType.NVarChar;
AccountNumsParam.Value = AccountNumsString;
我需要最终查询以如下方式执行:

reportQuery = 
"
Select *
From tableName
Where Account_Number in (@AccountNum);
and Account_Date = @AccountDate
";
Select *
From tableName
Where Account_Number in ('AX3456','YZYL123','ZZZ123');
and Account_Date = '1-Jan-2010'
问题是我在C#字符串列表中有这些帐号(实际上是文本)。为了将其提供给参数,我已经将参数声明为字符串。我将列表转换为一个字符串,并将其提供给参数。我想问题是我给paramater喂食的是:

"'AX3456','YZYL123','ZZZ123'" 
当它想要这个的时候

'AX3456','YZYL123','ZZZ123'
如何使用参数将字符串列表放入查询中,并按如上所示执行它

这就是我声明和分配参数的方式

SqlParameter AccountNumsParam = new SqlParameter();
AccountNumsParam.ParameterName = "@AccountNums";
AccountNumsParam.SqlDbType = SqlDbType.NVarChar;
AccountNumsParam.Value = AccountNumsString;
仅供参考,AccountNumString==“'AX3456','YZY123','ZZ123'”

如何:

cmd.Parameters.AddWithValue("@AccountNums", string.Join(",", accountNums.ToArray()));

这是一件不像看上去那么容易的事情。一种选择是不使用参数化查询,而是自己构建查询,尽管这很容易使您遭受SQL注入攻击,因此通常不建议这样做

我看到的另一个选项是将值作为逗号分隔的字符串传入,然后依靠UDF为您解析

第三个选项(我最喜欢的选项)是将数据序列化为xml,将其作为xml数据类型传入,然后在in关键字后进行子查询,从xml中提取值。老实说,我以前只对存储过程做过这样的操作,所以我不能肯定它在参数化查询中是否也能正常工作,尽管我认为会


查看我的博客,了解如何在sql server中查询XML:

sql server的哪个版本?如果2008,请使用表值参数,如果没有看到各种可能性,或者是2008年。我会检查一下然后回来。谢谢我不喜欢上面列出的“副本”中选择的答案。否则,我会自己关闭这个。现在我不能选择我喜欢的答案。使用表值参数效果很好。约翰的名声很好。我很想相信他的话。我本应该把“'”+string.Join(“',”,accountNums.ToArray())+“'”放进去的,但这仍然不起作用。有人知道原因吗?因为您仍在(@OneSingleParam)中执行
,所以匹配的
@OneSingleParam
的值恰好包含一个带逗号的字符串。实际上,这篇ms kb文章解释了原因:SqlParameter转义字符,以防止sql注入攻击:)