我目前正在尝试为数据库中的所有存储过程编写一个简单的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/