Ответ 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, которая имеет эту функцию, и мой поиск ничего не принес.