Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
То, что Вы пытаетесь сделать, возможно, но не использует Ваш текущий подход. Это - очень типичная проблема со всеми возможными решениями до SQL Server 2008, имея торговлю offs связанный с производительностью, безопасностью и использованием памяти.
Эта ссылка показывает некоторые подходы для SQL Server 2000/2005
Поддержки SQL Server 2008, передающие параметр, передаваемый по значению таблицы.
Я надеюсь, что это помогает.
Вы хотите думать о том, куда тот список прибывает из. Обычно та информация находится в базе данных где-нибудь. Например, вместо этого:
SELECT * FROM [Table] WHERE ID IN (1,2,3)
Вы могли использовать подзапрос как это:
SELECT * FROM [Table] WHERE ID IN ( SELECT TableID FROM [OtherTable] WHERE OtherTableID= @OtherTableID )
Если я понимаю право, Вы пытаетесь передать список как параметр SQL.
Некоторые люди делали попытку этого прежде с ограниченным успехом:
Передача массивов к хранимым процедурам
Передача массива значений к SQL Server без обработки строк
Используя MS возможности XML 2005 SQL для передачи списка значений к команде
Нет, это не невозможно.
Ваш подход не работает (по крайней мере, в .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 значениями.
Я рекомендовал бы установить параметр, поскольку запятая разграничила строку значений, и используйте функцию Разделения в SQL для превращения этого в таблицу отдельного столбца значений, и затем можно использовать функцию IN.
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648 - Функции разделения
Я раньше имел ту же проблему, я думаю, что существует теперь способ сделать это непосредственно по API ADO.NET.
Вы могли бы считать вставку слов в поддающееся соблазну (плюс queryid или что-то) и затем относящийся к этому поддающейся соблазну от запроса. Или динамично создание строки запроса и избегает внедрения SQL другими мерами (например, проверки regex).
Если Вы хотите передать список как строку в параметре, Вы могли бы просто создать запрос динамично.
ОБЪЯВИТЕ, что @query varchar (500) УСТАНАВЛИВАЮТ @query = 'ВЫБОР и тому подобное, ГДЕ чепуха в (' + @list +')' ВЫПОЛНЯЕТСЯ (@query)