通常你会在什么地方遇到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的。其他的数据库是否为同样的行为,我不确定。

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

相关文章推荐

木马喜欢在什么地方.doc

  • 2008年04月18日 22:53
  • 37KB
  • 下载

判断点在原点什么地方

  • 2012年09月10日 14:48
  • 317B
  • 下载

java中的构造函数有什么用?用它有什么好处?在什么地方用?

构造函数是类的一个特殊方法,这个方法用来生成实例时由系统自动调用,程序员无法直接调用。构造函数方法名同类名相同且参数为空。...

电脑总是卡,问题究竟出在什么地方?谈及个人对于cpu的看法

对于计算机出现的延迟现象的分析,从而引申到cpu的产品分析和自己对于问题的看法!...

西安房价在下个月内什么地方最值得买?——上篇

问题解析 为什么是下个月呢?   因为我能够获取到的数据有限,目前只爬了2017.7月份展示在安居网、链家和房天下的静态数据。所以只能用这些数据预测一个月后的房价情况。 什么地方指的是哪些地方...

C# 通过 Observer观察者 设计模式 来理解 抽象类 和 接口 应用在什么地方

什么时候用抽象类?什么时候用接口?怎么理解抽象类?怎么理解接口? 一、百度解释抽象类和接口的区别 总而言之就是一句话:抽象类可以包含具体实现,接口只能包含定义。 实现接口时必须实现接口定义的...

电脑会在哪些地方暴露你的隐私

  • 2011年03月23日 14:44
  • 293KB
  • 下载

NSUserDefaults数据存储在什么地方

Where is a Mac Application's NSUserDefaults Data Stored? 15down votefavorite 7 I am...
  • yuanya
  • yuanya
  • 2014年03月30日 16:44
  • 1227

(三)美国大公司强在什么地方

美国以道指30成份股为代表的大公司,全球竞争力十分强大。 这个不是说市值高,上节列的30个公司,加起来是41000亿美元。中国拉出30个市值最大的股,总市值也很可观,中石油市值全球排123名的时候都...
  • thy822
  • thy822
  • 2012年02月15日 14:05
  • 5027

程序的局部变量 全局变量 动态申请数据分别存储在什么地方?

程序的局部变量 全局变量 动态申请数据分别存储在什么地方? 量的类别: 根据作用域可分为全局变量和局部变量。 根据生存周期可分为静态存储方式和动态存储方式,具体地又分为自动的(auto)、静态的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通常你会在什么地方遇到DBNull?
举报原因:
原因补充:

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