Список строк в SqlCommand через Параметры в C#

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

6
задан ConcernedOfTunbridgeWells 8 October 2008 в 21:57
поделиться

7 ответов

То, что Вы пытаетесь сделать, возможно, но не использует Ваш текущий подход. Это - очень типичная проблема со всеми возможными решениями до SQL Server 2008, имея торговлю offs связанный с производительностью, безопасностью и использованием памяти.

Эта ссылка показывает некоторые подходы для SQL Server 2000/2005

Поддержки SQL Server 2008, передающие параметр, передаваемый по значению таблицы.

Я надеюсь, что это помогает.

3
ответ дан 16 December 2019 в 21:48
поделиться

Вы хотите думать о том, куда тот список прибывает из. Обычно та информация находится в базе данных где-нибудь. Например, вместо этого:

SELECT * FROM [Table] WHERE ID IN (1,2,3)

Вы могли использовать подзапрос как это:

SELECT * FROM [Table] WHERE ID IN ( SELECT TableID FROM [OtherTable] WHERE OtherTableID= @OtherTableID )
3
ответ дан 16 December 2019 в 21:48
поделиться

Если я понимаю право, Вы пытаетесь передать список как параметр SQL.

Некоторые люди делали попытку этого прежде с ограниченным успехом:

Передача массивов к хранимым процедурам

Массивы и списки в SQL 2005

Передача массива значений к SQL Server без обработки строк

Используя MS возможности XML 2005 SQL для передачи списка значений к команде

1
ответ дан 16 December 2019 в 21:48
поделиться
  • Я пробую что-то невозможное?

Нет, это не невозможно.

  • Я проявил неправильный подход?

Ваш подход не работает (по крайней мере, в .net 2)

  • У меня есть ошибки в этом подходе?

Я попробовал бы решение "Joel Coehoorn" (2-е ответы), если это возможно. Иначе другая опция состоит в том, чтобы отправить "строковый" параметр со всеми значениями, разграниченными разделителем. Запишите динамический запрос (создайте его на основе значений от строки), и выполните его с помощью "должностного лица".

Другим решением будет сборка o запрос непосредственно из кода. Somthing как это:

StringBuilder sb = new StringBuilder();
for (int i=0; i< listOfWords.Count; i++)
{
    sb.AppendFormat("p{0},",i);
    comm.Parameters.AddWithValue("p"+i.ToString(), listOfWords[i]);
}

comm.CommandText = string.Format(""SELECT blahblahblah WHERE blahblahblah IN ({0})", 
sb.ToString().TrimEnd(','));

Команда должна быть похожей:

SELECT blah WHERE blah IN (p0,p1,p2,p3...)...p0='aaa',p1='bbb'

В MsSql2005, "В" работает только с 256 значениями.

1
ответ дан 16 December 2019 в 21:48
поделиться

Я рекомендовал бы установить параметр, поскольку запятая разграничила строку значений, и используйте функцию Разделения в SQL для превращения этого в таблицу отдельного столбца значений, и затем можно использовать функцию IN.

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648 - Функции разделения

0
ответ дан 16 December 2019 в 21:48
поделиться

Я раньше имел ту же проблему, я думаю, что существует теперь способ сделать это непосредственно по API ADO.NET.

Вы могли бы считать вставку слов в поддающееся соблазну (плюс queryid или что-то) и затем относящийся к этому поддающейся соблазну от запроса. Или динамично создание строки запроса и избегает внедрения SQL другими мерами (например, проверки regex).

0
ответ дан 16 December 2019 в 21:48
поделиться

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

ОБЪЯВИТЕ, что @query varchar (500) УСТАНАВЛИВАЮТ @query = 'ВЫБОР и тому подобное, ГДЕ чепуха в (' + @list +')' ВЫПОЛНЯЕТСЯ (@query)

0
ответ дан 16 December 2019 в 21:48
поделиться
Другие вопросы по тегам:

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