Какой правильный / лучший способ обрабатывать обнуляемые параметры в 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

Другие вопросы по тегам