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"]);
}
}
当我使用 sql datareader 从数据库检索数据时,尽管没有返回值 if(rdr["Id"] != null)
returned true 并最终抛出一个将 null 转换为整数的异常。
但是,如果我使用 if (rdr["Id"] != System.DBNull.Value) 则返回 false。
null 和 System.DBNull.Value 有什么区别?
Is there any difference between null and System.DBNull.Value? If yes, what is it?
I noticed this behavior now -
while (rdr.Read())
{
if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)
{
int x = Convert.ToInt32(rdr["Id"]);
}
}
While I retrieve data from the database using a sql datareader, though there is no value returned if(rdr["Id"] != null)
returned true
and eventually threw an exception for casting a null as integer.
But, this if I use if (rdr["Id"] != System.DBNull.Value)
returns false
.
What's the difference between null and System.DBNull.Value?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
好吧,
null
不是任何类型的实例。相反,它是一个无效的引用。但是,
System.DbNull.Value
是对System.DbNull
实例的有效引用(System.DbNull
是一个单例,>System.DbNull.Value
为您提供对该类的单个实例的引用,该实例表示数据库中不存在的* 值。*我们通常会说
null
,但我不想混淆这个问题。因此,两者之间存在很大的概念差异。关键字
null
表示无效引用。 System.DbNull 类表示数据库字段中不存在的值。一般来说,我们应该尽量避免使用相同的东西(在本例中是null
)来表示两个截然不同的概念(在本例中是无效引用与数据库字段中不存在的值)。请记住,这就是为什么很多人提倡使用 空对象模式,这这正是
System.DbNull
的一个示例。Well,
null
is not an instance of any type. Rather, it is an invalid reference.However,
System.DbNull.Value
, is a valid reference to an instance ofSystem.DbNull
(System.DbNull
is a singleton andSystem.DbNull.Value
gives you a reference to the single instance of that class) that represents nonexistent* values in the database.*We would normally say
null
, but I don't want to confound the issue.So, there's a big conceptual difference between the two. The keyword
null
represents an invalid reference. The classSystem.DbNull
represents a nonexistent value in a database field. In general, we should try avoid using the same thing (in this casenull
) to represent two very different concepts (in this case an invalid reference versus a nonexistent value in a database field).Keep in mind, this is why a lot of people advocate using the null object pattern in general, which is exactly what
System.DbNull
is an example of.从 DBNull 类 的文档中:
From the documentation of the DBNull class:
DBNull.Value 处理起来很烦人。
我使用静态方法检查它是否为 DBNull,然后返回该值。
另外,将值插入 DataRow 时,不能使用“null”,必须使用 DBNull.Value。
有两种“null”表示是一个糟糕的设计,没有明显的好处。
DBNull.Value is annoying to have to deal with.
I use static methods that check if it's DBNull and then return the value.
Also, when inserting values into a DataRow, you can't use "null", you have to use DBNull.Value.
Have two representations of "null" is a bad design for no apparent benefit.
DBNull.Value 是 .NET 数据库提供程序返回的值,用于表示数据库中的空条目。 DBNull.Value 不为 null,并且从数据库行检索的列值与 null 的比较将不起作用,您应始终与 DBNull.Value 进行比较。
http://msdn.microsoft.com/en-us/library /system.dbnull.value.aspx
DBNull.Value is what the .NET Database providers return to represent a null entry in the database. DBNull.Value is not null and comparissons to null for column values retrieved from a database row will not work, you should always compare to DBNull.Value.
http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx
DataRow 有一个名为
IsNull()
的方法,您可以使用该方法来测试该列是否具有空值 - 与数据库看到的空值有关。DataRow["col"]==null
将始终为false
。代替使用
。
DataRow has a method that is called
IsNull()
that you can use to test the column if it has a null value - regarding to the null as it's seen by the database.DataRow["col"]==null
will allways befalse
.use
instead.
Null 类似于 C++ 中的零指针。所以它是一个不指向任何值的引用。
DBNull.Value
完全不同,它是一个常量,当字段值包含 NULL 时返回。Null is similar to zero pointer in C++. So it is a reference which not pointing to any value.
DBNull.Value
is completely different and is a constant which is returned when a field value contains NULL.