99

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)最终true抛出了将 null 转换为整数的异常。

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

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

4

6 回答 6

129

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

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

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

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

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

于 2011-02-10T14:36:26.537 回答
23

DBNull 类的文档中:

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

于 2011-02-10T14:38:37.977 回答
12

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”表示是一个糟糕的设计,没有明显的好处。

于 2012-06-25T22:34:57.547 回答
5

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

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

于 2011-02-10T14:35:50.677 回答
3

DataRow 有一个被调用的方法,IsNull()如果该列具有空值,您可以使用该方法测试该列 - 关于数据库看到的空值。

DataRow["col"]==null永远都是false

采用

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

反而。

于 2011-02-10T14:37:38.197 回答
3

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

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

于 2011-02-10T14:38:16.163 回答