System.Data.SqlClient.SqlParameter.IsNullable的目的是什么?

Mar*_*tyn 23 .net sql sql-server ado.net sqlparameter

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

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

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

任何人都可以解释这个属性的目的吗?

谢谢你的期待.

寻求赏金的答案者应该查看这些链接:

如何将NULL限制为存储过程SQL Server的参数?

SQL参数IsNullable

我假设SqlParameter.IsNullable仅在......时才有意义?

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

ult*_*ife 24

SqlParameter类继承自定义的抽象基类DbParameter

    public abstract bool IsNullable {get; set;}
Run Code Online (Sandbox Code Playgroud)

因此SqlParameter需要公开实施该IsNullable属性.的DbParameter类是所有包含在数据库中的参数实现的基类System.Data.

必须假设有其他DBMS明确允许或拒绝将过程或函数参数显式定义为可空或不可空,并且SqlParameter.IsNullable仅存在,因为SqlParameter实现了更通用的公共数据库参数类和其他.NET常见的接口.数据库交互类.

查看反射器,除了在转换为"InstanceDescriptor"时传递值,SqlParameter该类不使用IsNullable.我没有深入研究InstanceDescriptor该类的用途,但我确实检查了SqlCommand类,特别是BuildParamList方法,它将转换SqlParameterCollection为发送到数据库的参数的SQL字符串.

BuildParamList方法遍历SqlParameterCollection,并使用a StringBuilder来构建参数字符串.在其实现中的任何位置BuildParamList都不使用该IsNullable属性或值.实际上,引用SqlParameter.IsNullable不会出现在SqlCommand类的任何地方.

我可能在某个将SqlParameter对象传递给另一个类的内部/私有方法中错过了对它的引用,但是如果该BuildParamList方法不使用它,则无关紧要,因为它不会影响发送到SQL的SQL字符串服务器.

除了您执行的测试用例之外,检查SqlCommand类的内容还支持您可以安全地忽略SqlParameter.IsNullable属性值的结论.

SQL Server端正在处理,我在互联网上快速搜索,看看我是否能找到任何允许明确可为空/不可为空的过程或函数参数的DBMS.当我遇到DB2的引用时,我停止了,它似乎需要在一个过程上设置一个特定的属性,以允许将空值传递给它.我不知道任何具有此功能的当代RDBMS,我的搜索没有产生任何其他东西.


Sha*_*pta 3

查看链接并阅读 MSDN 上的几篇文章后。

SqlParameter.IsNullable 属性实现接口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。

寻找您的评论和任何更正