Подтвердить что ты не робот

Какова цель System.Data.SqlClient.SqlParameter.IsNullable?

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

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

Посредством тестирования кажется, что установка свойства IsNullable в значение false не имеет эффекта и по-прежнему позволяет установить свойство SqlParameter.Value равным нулю.

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

Спасибо, что посмотрели.

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

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

SQL-параметр IsNullable

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

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

4b9b3361

Ответ 1

Класс 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, которая, по-видимому, требует, чтобы определенный атрибут был установлен в процедуре, позволяющей передавать ему значения null. Я не знаю ни одной современной RDBMS, которая имеет эту функцию, и мой поиск ничего не принес.

Ответ 2

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

Свойство SqlParameter.IsNullable реализует интерфейс IDataParameter.IsNullable и читает статью, в которой говорится: "Нулевые значения обрабатываются с использованием класса DBNull"

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

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

Поиск ваших комментариев и любых исправлений