Параметризированные запросы с ПОДОБНЫМ и В условиях

47
задан Sam 17 September 2013 в 17:48
поделиться

4 ответа

Скажем, то, что у Вас есть свои идентификаторы категории в целочисленном массиве, и Имя является строкой. Прием должен создать текст команды, чтобы позволить Вам вводить все свои идентификаторы категории как отдельные параметры и создавать нечеткое соответствие для имени. Чтобы сделать первого, мы используем цикл для построения последовательности названий параметра @p0 через @pN-1, где N является количеством идентификаторов категории в массиве. Тогда мы создаем параметр и добавляем его к команде со связанным идентификатором категории как значение для каждого именованного параметра. Тогда мы используем конкатенацию на имени в самом запросе для разрешения нечеткого поиска на имени.

string Name = "someone";
int[] categoryIDs = new int[] { 238, 1138, 1615, 1616, 1617,
                                1618, 1619, 1620, 1951, 1952,
                                1953, 1954, 1955, 1972, 2022 };

SqlCommand comm = conn.CreateCommand();

string[] parameters = new string[categoryIDs.Length];
for(int i=0;i<categoryIDs.Length;i++)
{
   parameters[i] = "@p"+i;
   comm.Parameters.AddWithValue(parameters[i], categoryIDs[i]);
}
comm.Parameters.AddWithValue("@name",$"%{Name}%");
comm.CommandText = "SELECT * FROM Products WHERE Category_ID IN (";
comm.CommandText += string.Join(",", parameters) + ")";
comm.CommandText += " OR name LIKE @name";

Это - полностью параметризированный запрос, который должен сделать Ваш DBA счастливым. Я подозреваю, что, так как это целые числа, хотя это не была бы большая часть угрозы безопасности только для построения текста команды непосредственно со значениями, все еще параметризовав имя. Если Ваши идентификаторы категории находятся в массиве строк, просто разделяют массив на запятых, преобразовывают каждого в целое число и хранят его в целочисленном массиве.

Примечание: я говорю массив и использую его в примере, но он должен работать на любой набор, хотя Ваше повторение будет, вероятно, отличаться.

Исходная идея от http://www.tek-tips.com/viewthread.cfm?qid=1502614&page=9

58
ответ дан tvanfosson 26 November 2019 в 19:46
поделиться

Этот подход не будет работать. Период.

В пункте ожидает список параметров сам, поэтому когда Вы связываете один параметр к нему, у Вас есть шанс передать в один значение.

Сборка Ваша строка оператора динамично, с точным количеством человека В заполнителях пункта Вы намереваетесь передать в, и затем добавить параметры и связать значения с ними в цикле.

6
ответ дан Tomalak 26 November 2019 в 19:46
поделиться

Вам нужен "%" в значении sql параметра.

SqlCommand comm = new SqlCommand("SELECT * FROM Products WHERE Category_ID IN (@categoryid1, @categoryid2) OR name LIKE @name", conn);
comm.Parameters.Add("@categoryid1", SqlDbType.Int);
comm.Parameters["@categoryid1"].Value = CategoryID[0];
comm.Parameters.Add("@categoryid2", SqlDbType.Int);
comm.Parameters["@categoryid2"].Value = CategoryID[1];
comm.Parameters.Add("@name", SqlDbType.Int);
comm.Parameters["@name"].Value = "%" + Name + "%";
13
ответ дан TcKs 26 November 2019 в 19:46
поделиться

не уверенный, если это - правильный путь, но это - способ, которым я выполнил в нем Прежде

список templist = новый список

коммуникация. Параметры. Добавьте (" @categoryids", SqlDbType.varchar); коммуникация. Параметры [" @categoryids"] .value = string.join ("", templist.toarray ())

-2
ответ дан B.A.Hammer 26 November 2019 в 19:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: