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

时间:2011-02-10 14:33:49

标签: c# null dbnull

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),则会返回false

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

6 个答案:

答案 0 :(得分:101)

好吧,null不是任何类型的实例。相反,它是无效的参考。

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

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

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

请记住,这就是为什么很多人一般都主张使用null object pattern,这正是System.DbNull的一个例子。

答案 1 :(得分:20)

来自DBNull class的文档:

  

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

答案 2 :(得分:10)

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:3)

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

DataRow["col"]==null总是false

使用

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

代替。

答案 5 :(得分:3)

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

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