Вставка «null» (буквально) в параметр хранимой процедуры - PullRequest
1 голос
/ 13 апреля 2010

Я пытаюсь вставить слово «Null» (буквально) в параметр для хранимой процедуры.По некоторым причинам SqlServer, кажется, думает, что я имею в виду NULL, а не «Null».Если я проверяю

IF @LastName IS NULL // Test: Do stuff

, то это обходит это, потому что параметр не равен нулю.

Но когда я делаю:

INSERT INTO Person (<params>) VALUES (<stuff here>, @LastName, <more stuff here>); // LastName is 'Null'

Это взрываетговоря, что LastName не принимает нули.Я бы очень не хотел иметь эту фамилию, но кто-то знает ... и она бомбит приложение.Мы используем SubSonic 2.0 (да, он довольно старый, но обновление болезненно) в качестве нашего DAL и, пройдя через него, я вижу, что он создает параметры правильно (насколько я могу судить).

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

DECLARE @myval VARCHAR(50)
SET @myval = 'Null'
CREATE TABLE #mytable( name VARCHAR(50))
INSERT INTO #mytable VALUES (@myval)
SELECT * FROM #mytable
DROP table #mytable

Любые мысли о том, как я могу это исправить?

edit: метод, заданный LastName, таков: myPerson.LastName = textBoxLastName.Text;

edit: при использовании SqlServer Profiler я вижу, что он отправляет ноль.Две странные вещи, я удивляюсь, почему мое «IF @lastName IS NULL» не срабатывает ... но теперь я должен посмотреть на SubSonic дальше, чтобы увидеть, меняется ли что-то в последнюю минуту, о которой я не знал.Я исследую это далее и сообщу.

edit: единственным ограничением является значение по умолчанию ''.

edit: ОК, я подтвердил, что это SubSonic пытается играть умно.

 if (param.ParameterValue == null || Utility.IsMatch(param.ParameterValue.ToString(), "null"))

Хорошая идея для использования Profiler, я совсем об этом забыл.

final edit: Стоит отметить, в будущем, что SubSonic заменит это в последнюю минуту впоставщик данных (в моем случае SqlDataProvider).В файле DataService.cs, где он вызывает Execute Scalar, параметры еще не были изменены.Они настраиваются, когда он запускает ExecuteScalar для DataProvider, который является абстрактным классом (поэтому у Postgre и Oracle будут свои биты кода).В частности, SubSonic.SqlDataProvider.AddParams - это то, что меня поразило.

Ответы [ 2 ]

1 голос
/ 13 апреля 2010

Стоит отметить, в будущем, что SubSonic заменит это в последнюю минуту в поставщике данных (в моем случае SqlDataProvider). В файле DataService.cs, где он вызывает Execute Scalar, параметры еще не были изменены. Они настраиваются, когда он запускает ExecuteScalar для DataProvider, который является абстрактным классом (поэтому у Postgre и Oracle будут свои биты кода). В частности, SubSonic.SqlDataProvider.AddParams - это то, что меня поразило.

0 голосов
/ 13 апреля 2010

Пожалуйста, попробуйте это:

Упс ... Я совершенно не понял вопроса. Я думаю, что должны быть некоторые ограничения, установленные в столбце базы данных. Пожалуйста, попробуйте написать запрос вставки непосредственно в БД и посмотреть, если он разорвется.

Я попробовал это, и он взорвался, как и ожидалось:

DECLARE @myval VARCHAR(50)
SET @myval = 'null'
CREATE TABLE #mytable( name VARCHAR(50) NULL CHECK (name <> 'NULL'))
INSERT INTO #mytable VALUES (@myval)
SELECT * FROM #mytable WHERE name is not null
DROP table #mytable

НТН

...