我目前正在尝试为数据库中的所有存储过程编写一个简单的C#包装器类。

在C#中构建一些参数时,我注意到了SqlParameter.IsNullable属性,并想知道这是做什么用的。据我所知,不可能将存储过程参数声明为NOT NULL,因此始终允许将NULL传递给任何参数。

通过测试,似乎将IsNullable属性设置为false无效,并且仍然允许将SqlParameter.Value属性设置为null。

谁能解释这个属性(property)的目的?

感谢您的光临。

寻找赏金的答题者应查看以下链接:

How to restrict NULL as parameter to stored procedure SQL Server?

SQL Parameter IsNullable

I assume SqlParameter.IsNullable only makes sense when…?

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

最佳答案

SqlParameter类继承自抽象基类DbParameter,后者定义了

    public abstract bool IsNullable {get; set;}

因此,SqlParameter需要具有IsNullable属性的公共(public)实现。 DbParameter类是System.Data中包含的所有数据库参数实现的基类。

然后必须假定存在其他DBMS,这些DBMS明确允许或拒绝将过程或函数参数显式定义为可为空或不可为空,并且SqlParameter.IsNullable仅存在,因为SqlParameter实现了更通用的其他通用数据库参数类和接口(interface)。 NET数据库交互类。

在反射器中看,SqlParameter类不使用IsNullable,除了在将其转换为“InstanceDescriptor”时将值传递给其他人之外。我没有深入研究InstanceDescriptor类的用途,但确实检查了SqlCommand类,特别是BuildParamList方法,该方法将SqlParameterCollection转换为发送到数据库的SQL字符串参数。
BuildParamList方法遍历SqlParameterCollection,并使用StringBuilder来构建参数字符串。 BuildParamList在其实现中的任何地方均不使用IsNullable属性或值。实际上,对SqlParameter.IsNullable的引用没有出现在SqlCommand类中的任何地方。

我可能会在将SqlParameter对象传递给另一个类的某些内部/私有(private)方法中错过对它的引用,但是如果BuildParamList方法不使用它,则没关系,因为它不会影响正在发送的SQL字符串到SQL Server。

除了执行的测试用异常(exception),检查SqlCommand类的内容还支持以下结论:可以安全地忽略SqlParameter.IsNullable属性值。

在处理SQL Server方面时,我在Internet上进行了快速搜索,看是否可以找到允许显式可空/不可空过程或函数参数的DBMS。当遇到DB2的引用时,我停了下来,该引用似乎要求在过程中设置特定属性以允许将空值传递给它。我不知道任何具有此功能的当代RDBMS,并且我的搜索没有得到其他结果。

关于.net - System.Data.SqlClient.SqlParameter.IsNullable的用途是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5821850/

10-09 08:47