Использование оператора «IN» с объектом команд SQL и C # 2.0 - PullRequest
4 голосов
/ 30 декабря 2008

Я хотел бы вызвать SQL-оператор, такой как:

Select * From Table Where Column in ('value1', 'value2', 'value3')

Это так же просто, как установить значение параметра команды равным "('value1', 'value2', 'value3')"?

Ответы [ 3 ]

5 голосов
/ 12 ноября 2009

@ Чарльз: Вы идете в правильном направлении, но мы используем параметризованные запросы, чтобы в основном предотвратить SQL-инъекции. Размещение «внешних» значений (params string[] args) в запросах жестко закодировано, что вызывает проблемы. Вы можете перебирать аргументы, но вы все равно должны использовать такие параметры:

   string[] values = new [] {"value1", "value2", "value3", "value4"};
   StringBuilder query = new StringBuilder("Select * From Table Where Column in (");
   SqlCommand cmd = new SqlCommand();
   cmd.Connection = new SqlConnection("Your connection string");
   for(int i = 0; i < columns.Length; i++)
   {
       string arg = string.Format("@arg{0}", i);
       cmd.Parameters.AddwithValue(arg, SanatizeSqlString(columns[i]));
       sb.AppendFormat("{0}, ", arg);
   }
   sb = sb.Remove(sb.Length -2, 2);
   sb.Append(")");
   cmd.CommandText = sb.ToString();

Таким образом, вы получите запрос типа:

select * from table where column in (@arg0, @arg1, @arg2, @arg3)
0 голосов
/ 30 декабря 2008

Другой вариант - установить тип команды SqlCommand равным «text» и создать всю строку Sql в коде ... Предполагая, что Column является varchar, и у вас есть значения в массиве строк с именем «paramValues»

       StringBuilder sbSql = new StringBuilder
                   ("Select * From Table Where Column in (");
       string[] paramValues = new string[] {"value1", "value2", "value3"};
       foreach (string val in paramValues)
          sbSql.Append("'" + val + "', ");
       sbSql = sbSql.Remove(sbSql.Length - 2, 2);
       sbSql.Append(")");

       SqlCommand cmd = new SqlCommand(sbSql.ToString());
       cmd.CommandType = CommandType.Text; 
0 голосов
/ 30 декабря 2008

если у вас есть только три параметра для предложения in, тогда да, вы можете использовать параметры. В противном случае вы можете построить динамический SQL (будьте осторожны с атаками внедрения SQL).

Другой подход заключается в создании UDF, который принимает строку с разделителями и возвращает таблицу. тогда вы можете изменить свой запрос так:

select * from 
table inner join
dbo.fn_stringToTable(@params)
...