null和System.DBNull.Value有什么区别?
null和System.DBNull.Value之间是否有区别? 如果是,那是什么?
我现在注意到了这种行为 –
while (rdr.Read()) { if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value) { int x = Convert.ToInt32(rdr["Id"]); } }
尽pipe我使用sql datareader从数据库中检索数据,但是if(rdr["Id"] != null)
返回true
并且最终抛出了一个用于将null转换为整数的exception,则没有返回值。
但是,如果我使用if (rdr["Id"] != System.DBNull.Value)
返回false
。
null和System.DBNull.Value有什么区别?
那么, null
不是任何types的实例。 相反,这是一个无效的参考。
但是, System.DbNull.Value
是对System.DbNull
实例的有效引用( System.DbNull
是一个单例, System.DbNull.Value
提供了对该类的单个实例的引用),它表示不存在的*值数据库。
*我们通常会说null
,但我不想混淆这个问题。
所以,两者在概念上有很大的区别。 关键字null
表示无效的引用。 类System.DbNull
表示数据库字段中不存在的值。 一般来说,我们应该尽量避免使用相同的东西(在这种情况下为null
)来表示两个非常不同的概念(在这种情况下,数据库字段中的值是无效的,而不是一个不存在的值)。
请记住,这就是为什么很多人主张使用空对象模式 ,这正是System.DbNull
的一个例子。
从DBNull类的文档:
不要将面向对象的编程语言中的null与DBNull对象混淆。 在面向对象的编程语言中,null表示没有对象的引用。 DBNull表示未初始化的变体或不存在的数据库列。
DBNull.Value是.NET数据库提供程序返回的数据库中的空项。 DBNull.Value不为空,并且对从数据库行检索的列值进行比较为null将不起作用,因此应始终与DBNull.Value进行比较。
http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx
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。
有两个“空”的表示是一个不好的devise,没有明显的好处。
DataRow有一个名为IsNull()
的方法,如果它有一个空值,可以用它来testing列 – 关于数据库看到的null。
DataRow["col"]==null
将永远是false
。
使用
DataRow r; if (r.IsNull("col")) ...
代替。
空类似于C ++中的零指针 。 所以这是一个没有指向任何价值的参考 。
DBNull.Value
是完全不同的,是一个字段值包含NULL时返回的常量 。