Какова цель System.Data.SqlClient.SqlParameter.IsNullable? - PullRequest
23 голосов
/ 28 апреля 2011

В настоящее время я пытаюсь написать простой класс оболочки C # для всех хранимых процедур в базе данных.

При создании некоторых параметров в C # я заметил свойство SqlParameter.IsNullable и задумался, для чего это нужно. Насколько мне известно, невозможно объявить параметр хранимой процедуры как NOT NULL, и поэтому NULL всегда разрешено передавать любому параметру.

В ходе тестирования выясняется, что установка для свойства IsNullable значения false не имеет никакого эффекта и все еще позволяет свойству SqlParameter.Value иметь значение null.

Кто-нибудь может объяснить цель этого свойства?

Спасибо за внимание.

Отвечающие в поисках награды должны просмотреть эти ссылки:

Как ограничить NULL как параметр для хранимой процедуры SQL Server?

Параметр SQL IsNullable

Я полагаю, SqlParameter.IsNullable имеет смысл только тогда, когда ...?

http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/b7a08616-58d1-4cdc-a3e9-9353e292667b

Ответы [ 2 ]

23 голосов
/ 22 июня 2012

Класс SqlParameter наследует от абстрактного базового класса DbParameter , который определяет

    public abstract bool IsNullable {get; set;}

Так что SqlParameter должна иметь публичную реализацию свойства IsNullable.Класс DbParameter является базовым классом для всех реализаций параметров базы данных, включенных в System.Data.

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

Если смотреть в отражателе, SqlParameterкласс не использует IsNullable, кроме как для передачи значения, когда оно преобразуется в «InstanceDescriptor».Я не копался в том, для чего используется класс InstanceDescriptor, но я проверил класс SqlCommand, в частности, метод BuildParamList, который преобразует SqlParameterCollection в строку параметров SQL, отправляемых в базу данных..

Метод BuildParamList перебирает SqlParameterCollection и использует StringBuilder для построения строки параметра.BuildParamList не использует свойство или значение IsNullable нигде в своей реализации.Фактически, ссылка на SqlParameter.IsNullable не появляется нигде в классе SqlCommand.

Возможно, я пропустил ссылку на него в каком-то внутреннем / частном методе, который передает объект SqlParameter другомукласса, но если метод BuildParamList не использует его, это не имеет значения, поскольку он не влияет на строку SQL, отправляемую на SQL Server.

В дополнение к выполненным вами тестам, изучаетсяСодержимое класса SqlCommand подтверждает вывод о том, что вы можете спокойно игнорировать значение свойства SqlParameter.IsNullable.

Когда мы позаботились о стороне SQL Server, я быстро обыскал Интернет, чтобы узнать, смогу ли я.найти любые СУБД, которые допускают явно обнуляемые / не обнуляемые параметры процедуры или функции.Я остановился, когда натолкнулся на ссылку для DB2, которая, по-видимому, требует, чтобы в процедуре был задан определенный атрибут, позволяющий ему передавать нулевые значения.Я не знаю ни одной современной СУБД, обладающей этой функцией, и мой поиск ничего больше не дал.

3 голосов
/ 21 июня 2012

После просмотра ссылок и прочтения нескольких статей на MSDN.

Свойство SqlParameter.IsNullable реализует интерфейс IDataParameter.IsNullable и, читая статью, утверждает, что «нулевые значения обрабатываются с использованием класса DBNull»

DBNull Класс реализует только один интерфейсный метод IConvertible.ToType Инфраструктура.Преобразует текущий объект DBNull в указанный тип. «Который также заявляет» DBNull.Value может использоваться для явного присвоения несуществующего значения полю базы данных, хотя большинство поставщиков данных ADO.NET автоматически назначают значения DBNull, когда поле не имеетдопустимое значение "

Чтение этого означает, что большинство классов ADO.NET автоматически реализует это свойство и выполняет преобразование типа NULL в DBNull позади рисунка. Насколько я понимаю, я предполагаю, что если мы writing our own APIнапример, (System.Data.CustomDatabaseClient вместо System.Data.SqlClient) для установления соединения и других задач базы данных, и я не реализую это свойство, тогда любой, кто использует System.Data.CustomDatabaseClient, должен явно преобразовать значения Null в DBNull.

Ищем ваши комментарии и исправления

...