prakashraj2890 Ответов: 1

Хотите преобразовать элементы списка в sqlparameter...


У меня есть список идентификаторов prduct в списке PrductID;
который я хочу использовать в asp.net формирование запроса c# в предложении IN.

Что я уже пробовал:

я могу преобразовать этот список в разделенные запятыми значения в виде одной строки и использовать в запросе, как показано ниже.
напр.
"SELECT * from Emp where empID in ("+strProductID+")";
а с помощью DataReader я могу выполнить запрос, но опять же я не могу использовать этот "strProductID" непосредственно в запросе, который не является безопасным...
поэтому я хочу, чтобы преобразовать каждое значение из списка в объект sqlparameter, так что он будет защищен от sqlinjection.

Gerry Schmitz

Где вы взяли свой "список идентификаторов продукта"?

Mike V Baker

Создайте SP в базе данных sql server, которая принимает список идентификаторов продуктов в одном параметре?

1 Ответов

Рейтинг:
12

Eric Lynch

Есть несколько возможных ответов на ваш вопрос. Если список идентификаторов продуктов поступает из базы данных, вам лучше всего изменить свой запрос либо на использование JOIN, либо на EXISTS с суб-select (используя любое предложение WHERE, которое ограничивает идентификаторы продуктов желаемыми).

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

Использовать Возвращающие Табличное Значение Параметры (СУБД) Майкрософт Документы[^]

Хотя обычно это не очень хороший подход, если вы знаете, что ваш список будет коротким и просто хотите построить команду с параметрами (чтобы избежать SQL-инъекции), должно сработать что-то вроде следующего:

var builder = new StringBuilder(1024);
int count = list.Count;

builder.Append("SELECT * from Emp where empID in (");
for (int index = 1; index <= count; index++)
{
  if (index > 1)
    builder.Append(',');

  builder.Append($"@p{index}");
}
builder.Append(")");

using (var command = new SqlCommand(builder.ToString(), connection))
{
  SqlParameterCollection parameters = command.Parameters;
  for (int index = 1; index <= count; index++)
    parameters.AddWithValue($"p{index}", list[index]);

  // Do what you want with the command
}