Какой правильный / лучший способ обрабатывать обнуляемые параметры в Insight.Database?
Я использую Insight.Database около года для вызова хранимых процедур, но я только что столкнулся с ситуацией, когда хранимая процедура имеет параметр по умолчанию, который можно обнулять, который Insight не обрабатывает, как я ожидал.
Вкратце, параметр определяется как paramName nvarchar(10) = ''
, Код для вызова этого процесса был старомодным кодом SqlCommand/SqlParam, который просто не устанавливал параметр вообще. Я заменял это на объект.net:
Class MyObject
Public Property paramName As String
....
End Class
Предположим, вы создаете объект этого типа, не устанавливайте paramName
и передать его в проц. Я ожидал, что proc будет использовать значение по умолчанию. Но вместо этого происходит то, что Insight отправляет в процесс значение NULL, которое НЕ то же самое, что ничего не отправлять, процесс видит указанный параметр и поэтому не использует значение по умолчанию, а этот конкретный процесс фактически обрабатывает NULL. отличается от стандартного, который сломал приложение.
Я бы сказал, что ошибка в процедуре, но мне все еще нужен способ управления поведением обнуляемых параметров, чтобы я мог вызывать прокы такого типа, которые я не могу изменить.
1 ответ
Я счастлив, что у вас был год успеха с Insight.Database.
Когда Insight связывает объект со списком параметров, он сопоставляет любые подходящие свойства.
Так:
class Foo { string Param; }
CREATE PROC MyProc (@Param varchar(50))
Foo.Param отображается на @Param
В самых простых случаях кодеры хотят, чтобы NULL отображался в DBNull.Value. Поэтому, если Param равен NULL, Insight свяжет параметр и установит для @Param значение (DB)NULL.
Когда вы используете ADO.NET для вызова хранимого процесса с параметром по умолчанию, вы обычно пропускаете параметр или не устанавливаете значение. Затем ADO.NET сообщает серверу использовать значение по умолчанию.
CREATE PROC MyProc (@Param varchar(50) = NULL)
Вы можете сделать это с Insight, полностью пропустив параметр:
class Foo { /* Param not bound */ }
Затем Insight оставляет значение несвязанным, и ADO.NET будет использовать значение по умолчанию.
Я не сталкивался со случаем, когда вы должны использовать оба параметра по умолчанию И значения NULL для одного и того же процесса.
Поэтому самое простое решение - опустить параметр, но если это не сработает, я могу добавить функцию, которая позволит вам контролировать, что означает NULL. Подобно:
class Foo { [NullMeansUseDefault] string Param; }
Конечно, я хотел бы лучшего имени для атрибута.
Если вы считаете, что эта функция решит вашу проблему, откройте ее по адресу https://github.com/jonwagner/Insight.Database/issues