Я пытаюсь вставить слово «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 - это то, что меня поразило.