我目前正在尝试为数据库中的所有存储过程编写一个简单的C#包装类。
在C#中构建一些参数时,我注意到属性SqlParameter.IsNullable,并想知道这是什么。据我所知,无法将存储过程参数声明为NOT NULL,因此始终允许将NULL传递给任何参数。
通过测试,似乎将IsNullable属性设置为false无效,仍然允许将SqlParameter.Value属性设置为null。
有人可以解释这个属性的目的吗?
感谢您的光临。
寻找赏金的答案者应该查看这些链接:
How to restrict NULL as parameter to stored procedure SQL Server?
I assume SqlParameter.IsNullable only makes sense when…?
http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/b7a08616-58d1-4cdc-a3e9-9353e292667b
答案 0 :(得分:23)
SqlParameter类继承自定义
的抽象基类DbParameter public abstract bool IsNullable {get; set;}
因此SqlParameter
需要公开实现IsNullable
属性。 DbParameter
类是System.Data
中包含的所有数据库参数实现的基类。
必须假设有其他DBMS明确允许或拒绝将过程或函数参数显式定义为可空或不可为空,并且SqlParameter.IsNullable
仅存在,因为SqlParameter实现了更通用的公共数据库参数类和其他.NET数据库交互类通用的接口。
查看反射器,SqlParameter
类不使用IsNullable
,除了在转换为“InstanceDescriptor”时传递值。我没有深入研究InstanceDescriptor
类的用途,但我查看了SqlCommand
类,特别是BuildParamList
方法,它将SqlParameterCollection
转换为发送到数据库的SQL字符串参数。
BuildParamList
方法遍历SqlParameterCollection
,并使用StringBuilder
构建参数字符串。 BuildParamList
在其实现中的任何位置都不使用IsNullable
属性或值。实际上,对SqlParameter.IsNullable
的引用不会出现在SqlCommand类中的任何位置。
我可能在某个内部/私有方法中错过了对它的引用,该方法将SqlParameter
对象传递给另一个类,但如果BuildParamList
方法不使用它,则它不会这很重要,因为它不会影响发送到SQL Server的SQL字符串。
除了您执行的测试用例之外,检查SqlCommand
类的内容支持您可以安全地忽略SqlParameter.IsNullable
属性值的结论。
SQL Server端正在处理,我在互联网上快速搜索,看看我是否能找到任何允许明确可为空/不可为空的过程或函数参数的DBMS。当我遇到DB2的引用时,我停止了,它似乎需要在一个过程上设置一个特定的属性,以允许将空值传递给它。我不知道任何具有此功能的当代RDBMS,我的搜索没有产生任何其他内容。
答案 1 :(得分:3)
查看链接并阅读MSDN上的一些文章。
SqlParameter.IsNullable Property实现接口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。
寻找您的评论和任何更正