在C#中向OracleCommand.Parameters添加字符串列表

7
以下查询有一个参数需要分配一个字符串列表:
select * from a_table where something in :list_of_strings

我有一个C#的 List<string>,我想将它赋值给 list_of_strings 参数。
假设有一个代表上述查询的 OracleCommand,我该如何将我的 List<string> 绑定到命令的 list_of_strings 参数?

不确定这个问题是否类似于 https://dev59.com/9lfUa4cB1Zd3GeqPJ6a2。 - Daniel Kelley
这可能会对您有所帮助。http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:139812348065 - OldProgrammer
1个回答

6

事实上,你不能将单个参数绑定到值的列表中。在这种情况下,你可以将这些值连接成查询字符串。
然而,这样做是不建议的,因为IN子句上可以放置的值有限制。

List<string> list = new List<string>();
list.Add("1");
list.Add("2");
list.Add("3");
list.Add("4");

string listStr = string.Join(",", list);
//result: "1,2,3,4"

如果您的字符串列表是一个字符串列表,您可以这样做:

List<string> list = new List<string>();
list.Add("one");
list.Add("two");
list.Add("three");
list.Add("four");

string listStr = string.Concat("'", string.Join("','", list), "'");
//result: "'one','two','three','four'"

查询字符串:

string query = string.Format("select * from a_table where something in({0})", listStr);

注意:你可能需要处理列表为空的情况。

另一种可能性是将所有值插入临时表,并在选择语句中使用它。这样做的优点是可以容纳无限的字符串值,并避免与连接技术相比在DBMS上进行新的硬解析:

SELECT * 
    FROM A_TABLE 
   WHERE SOMETHING IN(SELECT SOMETHING FROM TEMP_TABLE)

4
小心。如果您没有对列表参数进行消毒处理,您就会面临 SQL 注入的风险。 - Kevin Ortman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接