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

sna*_*ile 4 c# oracle ado.net

以下查询具有要分配字符串列表的参数:

select * from a_table where something in :list_of_strings
Run Code Online (Sandbox Code Playgroud)

我有一个C#List<string>,我想分配给list_of_strings参数.

给定OracleCommand(表示上述查询),如何将my绑定List<string>到命令的list_of_strings参数?

Mt.*_*ers 5

实际上,您不能将单个参数绑定到值列表.在这种情况下,您可以将值连接到查询字符串.
但是,由于您可以对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"
Run Code Online (Sandbox Code Playgroud)

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

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'"
Run Code Online (Sandbox Code Playgroud)

请求参数:

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

Obs:您可能必须处理列表为空的可能性.

另一种可能性是将所有值插入临时表并在select语句中使用它.与串联技术相比,这将具有无限字符串值的优势并避免在DBMS上进行新的硬解析:

SELECT * 
    FROM A_TABLE 
   WHERE SOMETHING IN(SELECT SOMETHING FROM TEMP_TABLE)
Run Code Online (Sandbox Code Playgroud)

  • 小心点.如果您没有清理列表参数,那么您可以打开SQL注入. (3认同)