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"] != null)
true
但是,如果我使用if (rdr["Id"] != System.DBNull.Value)return的话false。
if (rdr["Id"] != System.DBNull.Value)
false
null和System.DBNull.Value有什么区别?
恩,null不是任何类型的实例。而是,它是无效的引用。
null
但是,表示数据库中不存在的*值System.DbNull.Value的有效引用System.DbNull(System.DbNull是单例,并System.DbNull.Value为您提供了该类的单个实例的引用)。
System.DbNull.Value
System.DbNull
*我们通常会说null,但我不想混淆这个问题。
因此,两者之间存在很大的概念差异。关键字null代表无效的参考。该类System.DbNull表示数据库字段中不存在的值。通常,我们应该尝试避免使用同一事物(在这种情况下null)来表示两个截然不同的概念(在这种情况下,无效引用与数据库字段中不存在的值)。
请记住,这就是为什么很多人通常主张使用空对象模式的原因,这正是System.DbNull一个例子。