2011-04-28 148 views
21

我目前正在尝试为数据库中的所有存储过程编写一个简单的C#包装类。System.Data.SqlClient.SqlParameter.IsNullable的用途是什么?

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

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

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

感谢您的期待。

答复者找赏金应审查这些链接:

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

+0

如果你定义一个存储过程的参数“没有”空指令,那么你就不能在空通(DB将抛出你的错误) – 2011-04-28 16:45:53

+1

@ M.R。我不确定你的意思是由空指令。你说的是设置默认值设置为null即:@MyInt INT = NULL,你可以提供一个参数声明的例子有没有这个“空指令” – Martyn 2011-04-28 17:56:27

+0

正确 - @MyInt INT VS @MyInt INT = NULL。当你做前者时,无论如何你都无法传递null ...... – 2011-04-28 17:59:37

回答

3

看的联系,并在MSDN上阅读几篇文章之后。

SqlParameter.IsNullable Property实现接口IDataParameter.IsNullable和读取它指出

DBNull类实现只有一个接口方法IConvertible.ToType基础结构“空值使用DBNull类处理”的文章。将当前DBNull对象转换为指定的类型“,其中还指出”DBNull.Value可用于将不存在的值明确分配给数据库字段,尽管大多数ADO.NET数据提供程序在字段没有有效时自动分配DBNull值值”

读这意味着大部分的ADO.NET类的,如果我们writing our own API如(System.Data.CustomDatabaseClient自动实现此特性,做NULL的类型转换的DBNull图片后面。按我的理解,我假设,而不是System.Data.SqlClient)进行连接和其他数据库任务,我没有实现这个属性,那么任何使用System.Data.CustomDatabaseClient的人都必须明确地将Null值转换为DBNull。

寻找您的意见和任何修正

21

的的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字符串被发送到SQL Server。

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

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

+0

感谢您的深入研究。我认为这证明它在SqlParameter中没有任何作用,并且它仅仅是一个实现需求,因为它是基础接口。这是一个耻辱,1)文档没有这样说,2)它似乎没有正确地设置为SQL Server的正确,因为SQL Server总是允许NULL传递,所以如果你检查这个来获取一些关于界面的想法,这是不正确的。 – 2012-06-22 02:16:31

+0

@ Ulty4life谢谢澄清。 – 2012-06-22 11:19:45