null 和 System.DBNull.Value 有什么区别?

发布于 2024-10-16 17:01:40 字数 499 浏览 9 评论 0原文

null 和 System.DBNull.Value 有什么区别吗?如果是,那是什么?

我现在注意到了这种行为 -

while (rdr.Read())
{
    if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)  
    {
        int x = Convert.ToInt32(rdr["Id"]);
    }
}

当我使用 sql datareader 从数据库检索数据时,尽管没有返回值 if(rdr["Id"] != null) returned true 并最终抛出一个将 null 转换为整数的异常。

但是,如果我使用 if (rdr["Id"] != System.DBNull.Value) 则返回 false。

null 和 System.DBNull.Value 有什么区别?

Is there any difference between null and System.DBNull.Value? If yes, what is it?

I noticed this behavior now -

while (rdr.Read())
{
    if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)  
    {
        int x = Convert.ToInt32(rdr["Id"]);
    }
}

While I retrieve data from the database using a sql datareader, though there is no value returned if(rdr["Id"] != null) returned true and eventually threw an exception for casting a null as integer.

But, this if I use if (rdr["Id"] != System.DBNull.Value) returns false.

What's the difference between null and System.DBNull.Value?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

随遇而安 2024-10-23 17:01:40

好吧,null 不是任何类型的实例。相反,它是一个无效的引用。

但是,System.DbNull.Value 是对 System.DbNull 实例的有效引用(System.DbNull 是一个单例,>System.DbNull.Value 为您提供对该类的单个实例的引用,该实例表示数据库中不存在的* 值。

*我们通常会说null,但我不想混淆这个问题。

因此,两者之间存在很大的概念差异。关键字 null 表示无效引用。 System.DbNull 类表示数据库字段中不存在的值。一般来说,我们应该尽量避免使用相同的东西(在本例中是 null)来表示两个截然不同的概念(在本例中是无效引用与数据库字段中不存在的值)。

请记住,这就是为什么很多人提倡使用 空对象模式,这这正是 System.DbNull 的一个示例。

Well, null is not an instance of any type. Rather, it is an invalid reference.

However, System.DbNull.Value, is a valid reference to an instance of System.DbNull (System.DbNull is a singleton and System.DbNull.Value gives you a reference to the single instance of that class) that represents nonexistent* values in the database.

*We would normally say null, but I don't want to confound the issue.

So, there's a big conceptual difference between the two. The keyword null represents an invalid reference. The class System.DbNull represents a nonexistent value in a database field. In general, we should try avoid using the same thing (in this case null) to represent two very different concepts (in this case an invalid reference versus a nonexistent value in a database field).

Keep in mind, this is why a lot of people advocate using the null object pattern in general, which is exactly what System.DbNull is an example of.

为人所爱 2024-10-23 17:01:40

DBNull 类 的文档中:

不要将面向对象编程语言中的 null 概念与 DBNull 对象混淆。在面向对象的编程语言中,null 表示不存在对对象的引用。 DBNull 表示未初始化的变体或不存在的数据库列。

From the documentation of the DBNull class:

Do not confuse the notion of null in an object-oriented programming language with a DBNull object. In an object-oriented programming language, null means the absence of a reference to an object. DBNull represents an uninitialized variant or nonexistent database column.

零時差 2024-10-23 17:01:40

DBNull.Value 处理起来很烦人。

我使用静态方法检查它是否为 DBNull,然后返回该值。

SqlDataReader r = ...;
String firstName = getString(r[COL_Firstname]);

private static String getString(Object o) {
   if (o == DBNull.Value) return null;
   return (String) o;
}

另外,将值插入 DataRow 时,不能使用“null”,必须使用 DBNull.Value。

有两种“null”表示是一个糟糕的设计,没有明显的好处。

DBNull.Value is annoying to have to deal with.

I use static methods that check if it's DBNull and then return the value.

SqlDataReader r = ...;
String firstName = getString(r[COL_Firstname]);

private static String getString(Object o) {
   if (o == DBNull.Value) return null;
   return (String) o;
}

Also, when inserting values into a DataRow, you can't use "null", you have to use DBNull.Value.

Have two representations of "null" is a bad design for no apparent benefit.

雾里花 2024-10-23 17:01:40

DBNull.Value 是 .NET 数据库提供程序返回的值,用于表示数据库中的空条目。 DBNull.Value 不为 null,并且从数据库行检索的列值与 null 的比较将不起作用,您应始终与 DBNull.Value 进行比较。

http://msdn.microsoft.com/en-us/library /system.dbnull.value.aspx

DBNull.Value is what the .NET Database providers return to represent a null entry in the database. DBNull.Value is not null and comparissons to null for column values retrieved from a database row will not work, you should always compare to DBNull.Value.

http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx

嘴硬脾气大 2024-10-23 17:01:40

DataRow 有一个名为 IsNull() 的方法,您可以使用该方法来测试该列是否具有空值 - 与数据库看到的空值有关。

DataRow["col"]==null 将始终为 false

代替使用

DataRow r;
if (r.IsNull("col")) ...

DataRow has a method that is called IsNull() that you can use to test the column if it has a null value - regarding to the null as it's seen by the database.

DataRow["col"]==null will allways be false.

use

DataRow r;
if (r.IsNull("col")) ...

instead.

呆头 2024-10-23 17:01:40

Null 类似于 C++ 中的零指针。所以它是一个不指向任何值的引用

DBNull.Value 完全不同,它是一个常量,当字段值包含 NULL 时返回。

Null is similar to zero pointer in C++. So it is a reference which not pointing to any value.

DBNull.Value is completely different and is a constant which is returned when a field value contains NULL.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文