C# DBNull和null说明

时间:2022-05-10 13:40:11

null 是.net中无效的对象引用。在数据类型中,对于引用类型的默认只就是为null,表示当前变量不指向任何对象。也称空指针。

DBNull是一个类。DBNull.Value是它唯一的实例。继承自Object

它用来对应数据库的数据为空(<NULL>)时,在.Net中的对应值。

object obj1 = DBNull.Value;

它不是数据类型,只是用来对应数据库中为null的值,表示“不知道”。


例如:数据库一列是int类型,可空,如果在读取数据库是对于DataRow,返回的数据null对应的结果就是DBNull.Value,

它的row[column]返回的值永远不会为null,所以row[column].ToString()这个写法不会抛出NullReferenceException的空指针异常。

接着说,如果想向数据库中的int列的值插入NULL的话,在指定数据库参数@id的时候,如果参数的值应该是DBNull.Value而不是null,如果是null则数据库抛出异常“@xxx 没有指定值”。

DBNull 实现了 IConvertible 。 但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。

在 IDbCommand(OleDbCommand,SqlCommand...) 的ExecuteScalar的返回值中,情况可以这样分析:

select 1 这样返回的object是 1

select null 这样返回的是DBNull.Value

select isnull(null,1) 返回的是 1

select top 0 id from table1 这样返回的值是null

select isnull(id,0) from table1 where 1=0 返回的值是null


这里 ExecuteScalar 的规则就是,返回第一列,第一行的数据。如果一行都没有,那么ExecuteScalar就返回null。如果有第一行,但是第一列为空,那么返回的是 DBNull 。如果第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。

你可以用Convert.IsDBNull来判断一个值是否DBNull。注意Convert.IsDBNull(null)是false,

也就是说null跟DBNull.Value是不等的。