.NET 2.0 可空类型和数据库空思考
如果 .NET 2.0 从版本 1 开始就存在可空类型,那么首先就不需要 DBNull.Value 了吗?
或者 RDBMS 的 null 与 .NET 的 null 没有关系? 也就是说,无论如何 .NET 版本 1 已经具有可为 null 的类型,DBNull.Value 仍然是需要的。
If .NET 2.0 nullable types was there from version 1, will DBNull.Value not be needed in the first place?
Or RDBMS's null has no bearing with .NET's null? That is DBNull.Value will still be needed anyhow, regardless of .NET version 1 already have nullable types.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
.NET 中的可空类型允许相关变量实际上为空。 DBNull 是一种表达“在另一个环境中,该值被认为是 null”的方式。 由于我们需要一种方法来区分实际上 null - 或“本机” null,如我们当前运行时本机的 null - 和我们与之通信的另一个系统中的 null,因此可空类型和 DBNull 具有完全不同的用途。
Nullable types in .NET allow the variable in question to actually be null. DBNull is a way to say "in another environment, this value was considered to be null". Since we need a way do differentiate between actually null - or "natively" null, as in native to our current runtime - and null in another system we communicate with, nullable types and DBNull serve completely different purposes.
null
和DBNull。在任何 .NET 版本中,值
都是两个不同的东西。例如:
参考。
null
andDBNull.Value
are two different things in any .NET version.For example:
Ref.
如果 System.Data.DataSetExtensions.dll 是可以遵循的,我猜测如果当时可以为 null 的值类型可用,那么 DBNull.Value 可能不会存在。
在将“foo”列设置为 DBNull.Value 的 DataRow 上使用该库的扩展方法,您会得到...
当然,与 C# 结合使用时,这是非常方便的? 运算符,当您想要提供默认值来代替数据库 null 时。 就我个人而言,我没有浪费时间在 IDataReader/IDataRecord 上实现类似的扩展方法。
If System.Data.DataSetExtensions.dll is anything to go by, I'm guessing that DBNull.Value probably wouldn't exist if nullable value types had been available at the time.
Using that library's extension methods on a DataRow that has a "foo" column set to DBNull.Value, you get...
This is, of course, incredibly convenient when combined with the C# ?? operator, when you want to provide a default value in place of a database null. Personally, I wasted no time implementing similar extension methods on IDataReader/IDataRecord.
我不太同意这一点。
仅当您不知道局部变量是否已从数据库中获取时才需要进行这种区分。 如果您知道该变量已从数据库中获取,则可以识别 null 和 DBNull。
但不同之处在于,编程语言中的 null 表示没有值,而 null == null 则为 true。 在数据库中,null 表示更像是未知值。 因此 null == null 在数据库中是 false; null 根本不等于任何东西,因为您无法判断一个未知值是否等于另一个未知值。 我不确定 DBNull 是否以这种方式实现,并且 DBNull.Value == DBNull.Value 的计算结果为 false。
编辑
我刚刚测试了它,DBNull 的行为并不像预期的那样。 DBNull.Value == DBNull.Value 计算结果为 true,但根据数据库 null 的语义应产生 false。
I do not really agree to this.
This distinction is only required if you do not know if your local variable has allready been fetched from the database. If you know that the variable has been fetched from the database it would be okay to identify null and DBNull.
But the difference is that null in programming languages signals the absence of a value and null == null is true. In databases the null indicates something more like an unknown value. Therefore null == null is false in databases; null equals nothing at all because you cannot tell for an unknown value if it equals another unknown value. I am not sure if DBNull is implemented this way and DBNull.Value == DBNull.Value evaluates to false.
EDIT
I just tested it and DBNull does not behave as exspected. DBNull.Value == DBNull.Value evaluates to true but should yield false with the semantic of the database null.