通常你会在什么地方遇到DBNull?

原创 2007年09月24日 16:55:00

这几天写数据库操作比较多,是时候写写关于DBNull的东西了。

DBNull在DotNet是单独的一个类型 System.DBNull 。它只有一个值 DBNull.Value 。DBNull 直接继承 Object ,所以 DBNull 不是 string , 不是 int , 也不是 DateTime 。。。

但是为什么 DBNull 可以表示数据库中的字符串,数字,或日期呢?原因是DotNet储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。

对于 DataRow , 它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。 要么就是 DBNull 。 所以 row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException。

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就直接对应的DotNet的值。如果有第一行,但是第一列为空,那么返回的是 DBNull 。如果一行都没有,那么ExecuteScalar就返回null

规则就是这样的。这里容易犯的一个错误是,把ExecuteScalar返回DBNull与null的情况混淆,例如:

string username=cmd.ExecuteScalar().ToString();

除非你认为cmd执行后,肯定至少有一行数据,否则这里就会出错。

又或者 select id from usertable where username=@name 这样的sql语句,如果找不到记录,那么ExecuteScalar则会返回null,所以千万不要

int userid=Convert.ToInt32(cmd.ExecuteScalar());

或者你会这样写 SQL 语句:select isnull(id,0) from usertable where username=@name

但是 int userid=Convert.ToInt32(cmd.ExecuteScalar()); 依然会出错,因为上面的语句不成立时,仍然是不返回任何行。

对于IDbDataParameter(OleDDbParameter,SqlParameter..)的Value,如果为null,则代表该参数没有指定,或者是代表DEFAULT。如果为DBNull.Value,则代表SQL中的NULL

所以,如果你要调用存储过程,里面有参数 @val nvarchar(20)="AABB" ,
那么cmd.Parameters["@val"].Value=null 代表使用这个默认的 "AABB"
而cmd.Parameters["@val"].Value=DBNull.Value 代表使用NULL来传给 @val


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


备注:以上的SQL语句全是指SQLSERVER2000的。其他的数据库是否为同样的行为,我不确定。

(先写到这里,想到再补充) 

通常你会在什么地方遇到DBNull? (转)

今天不只被外包,还要跑到虹桥机场去帮忙实施。可惜来到这里又好象没有什么事干。。:) 刚好可以写写Blog 。刚好这几天写数据库操作比较多,是时候写写关于DBNull的东西了。DBNull在DotNet...
  • gxh973121
  • gxh973121
  • 2004年10月13日 11:04
  • 573

通常你会在什么地方遇到DBNull?(转)

通常你会在什么地方遇到DBNull?            今天不只被外包,还要跑到虹桥机场去帮忙实施。可惜来到这里又好象没有什么事干。。:) 刚好可以写写Blog 。             刚好这...
  • deadshot123
  • deadshot123
  • 2005年10月07日 06:25
  • 815

通常你会在什么地方遇到DBNull?

今天不只被外包,还要跑到虹桥机场去帮忙实施。可惜来到这里又好象没有什么事干。。:) 刚好可以写写Blog 。刚好这几天写数据库操作比较多,是时候写写关于DBNull的东西了。DBNull在DotNet...
  • ant20060808
  • ant20060808
  • 2006年09月06日 10:59
  • 452

通常你会在什么地方遇到DBNull

DBNull在DotNet是单独的一个类型 System.DBNull 。它只有一个值 DBNull.Value 。DBNull 直接继承 Object ,所以 DBNull 不是 string , ...
  • longcanhua
  • longcanhua
  • 2006年06月27日 21:57
  • 1650

通常你会在什么地方遇到DBNull?

 DBNull在DotNet是单独的一个类型 System.DBNull 。它只有一个值 DBNull.Value 。DBNull 直接继承 Object ,所以 DBNull 不是 string ,...
  • loby_tao
  • loby_tao
  • 2009年01月17日 19:39
  • 260

[转帖]通常你会在什么地方遇到DBNull?

DBNull在DotNet是单独的一个类型 System.DBNull 。它只有一个值 DBNull.Value 。DBNull 直接继承 Object ,所以 DBNull 不是 string , ...
  • pch_wyu
  • pch_wyu
  • 2008年09月12日 15:18
  • 226

(转帖)通常你会在什么地方遇到DBNull?

DBNull在DotNet是单独的一个类型 System.DBNull 。它只有一个值 DBNull.Value 。DBNull 直接继承 Object...
  • shankaipingo
  • shankaipingo
  • 2006年01月30日 10:56
  • 948

什么地方遇到DBNull?

刚好这几天写数据库操作比较多,是时候写写关于DBNull的东西了。DBNull在DotNet是单独的一个类型 System.DBNull 。它只有一个值 DBNull.Value 。DBNull 直接...
  • jackwofe
  • jackwofe
  • 2007年09月01日 08:16
  • 352

C# 异常"关于对象不能从DBNull转换为其他类型"

最近Tony小编在完善一个系统时候,无意之中遇到了这个异常,后来经过度娘的指点,才得知这是在处理数据的时候如果数据库里面的值为null,就会出现的错误。 例如:num = Convert.ToInt3...
  • tony0225
  • tony0225
  • 2013年12月18日 15:36
  • 2683

关于System.DBNull的判断

利用Sstem .Data.DataSet为载体,从数据库中取得数据,当没有检索到数据时 DataSet.Tables(0).Rows(0).Item(0)返回就是"System.DBNull" ...
  • bigheadsheep
  • bigheadsheep
  • 2012年07月03日 11:02
  • 2101
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通常你会在什么地方遇到DBNull?
举报原因:
原因补充:

(最多只允许输入30个字)