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

pav*_*red 83 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"]);
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然我使用sql datareader从数据库中检索数据,但是没有返回if(rdr["Id"] != null)返回的值,true并最终抛出异常以将null转换为整数.

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

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

jas*_*son 106

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

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

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

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

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

  • +1一个实际例子:如果你使用`IDbCommand.ExecuteScalar()`,它可以返回null(没有返回记录)或`DbNull`(第一个记录中的第一列是'不存在的值').如果没有"DbNull",你将无法区分彼此. (39认同)
  • 空引用完全有效.☺ (3认同)

Hei*_*nzi 21

DBNull类的文档:

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


Loa*_*ing 11

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;
}
Run Code Online (Sandbox Code Playgroud)

此外,将值插入DataRow时,不能使用"null",必须使用DBNull.Value.

有两个"null"的表示是一个糟糕的设计,没有明显的好处.

  • 我们共同感到厌恶:您的最后一个陈述仅因讽刺而被击败,因为讽刺的是,出现在这里阅读该陈述并发现您的用户名“讨厌” (2认同)

Jam*_*are 5

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

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