今天不只被外包,还要跑到虹桥机场去帮忙实施。可惜来到这里又好象没有什么事干。。:) 刚好可以写写Blog 。

刚好这几天写数据库操作比较多,是时候写写关于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的。其他的数据库是否为同样的行为,我不确定。

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

转载于:https://www.cnblogs.com/thx-bj/archive/2008/04/13/1151417.html

通常你会在什么地方遇到DBNull?相关推荐

  1. C#中的DBNull、Null、和String.Empty解释

    1.对DBNull的解释:     该类用于指示不存在某个已知值(通常在数据库应用程序中).     在数据库应用程序中,空对象是字段的有效值.该类区分空值(空对象)和未初始化值(DBNull.Val ...

  2. C#中NULL,,DBNULL,String.Empty,Convert.IsDBNull()的区别

    C#中的空值的判断较麻烦,不象在VB6中那么简单,这些各种空值的判断和理解对不熟悉的人来说,可能很麻烦,现就我在使用过程中的一点体会和大家共同分享. (1)NULL null 关键字是表示不引用任何对 ...

  3. C#中的DBNull、Null、String.Empty和“”

    null可赋值任何变量,将变量置为空  DBNull只用于DataRow对象,表示数据库中的空值  String.Empty是0长度字串  Convert.IsDBNull判断是否为DBNull DB ...

  4. Ubuntu 系统 查看代码的方法在那些地方使用

    在某个包含要搜的的地方打开终端 ,或者使用工具自带的终端 使用grep 命令 例如: grep -rni "MainActivity" 回车即可 或者 grep -snr &quo ...

  5. 梦想的地方!地球上最值得去的20个地方【组图】

    如果你是一个热爱大自然的人你肯定会喜欢这个集合.地球上有太多的地方和风景值得我们这辈子至少要去看一次.大多数自然摄影师喜欢没有人出现在他们的照片中,他们想获得纯净.完美的风景,没有人类的影响.这篇文章 ...

  6. c语言大项目经验,C语言该学的地方(项目经验)

    一,基础部分:这里分两大块,一块就是数据结构,另一块是算法: 1.数据结构要看的是:基本的数据类型,int ,float,double, char ,指针; 1)扩展数据类型struct,枚举,联合; ...

  7. vc 只有顶级窗口可以弹出窗口_如果你刚换了新电脑,这几个地方记得设置一下,电脑可以多用几年...

    现在电脑在生活中已经很常见了,无论是办公还是在生活中都会用到它,但是刚买了的电脑的小伙伴都不会保护电脑,过了几个月后电脑就出现卡顿或者死机,这样就会缩短电脑的使用寿命. 今天就教教大家如何正确的使用电 ...

  8. java i o不会的地方_Java I/O 好复杂,傻傻分不清楚,别担心,我们有线索了。。。...

    IO 类图 小帅最近在学Java的IO类库,这么多类看得小帅人头昏眼花,常常是学了这个类,忘了那个类,再过一阵子就全忘了... 每次用到的时候,小帅都要重新读文档,看代码,如此循环,身心疲惫. 小帅没 ...

  9. 找不到物理服务器,日常物理服务器需要在什么地方升级?

    物理服务器在使用中是有寿命的,需要定期更新.除了常用的硬件更新,更大的升级因素是为了业务更好开展.我们在升级物理服务器的时候需要注意哪些地方呢? 一.升级没有提供重要功能的服务器 每一款新服务器都支持 ...

最新文章

  1. R语言split函数、unsplit函数按组拆分数据、合并数据实战
  2. java stringbuilder换行_初遇Java StringBuffer 和 StringBuilder 类利用 StringBuilder 给TextView实现换行处理...
  3. 浅谈SpringCloud (二) Eureka服务发现组件
  4. python内置函数源码_python如何查看内置函数源码
  5. ubuntu安装USB转串口驱动(PL2303)
  6. ELK+Kafka集群日志分析系统
  7. 使用C# lock同时访问共享数据
  8. [转]想要成为一名优秀的Java程序员,这份文档必读
  9. Android之使用PopupWindow让背景变黯但是华为手机出现屏幕一闪一闪问题解决办法
  10. 【决策单调性】玩具装箱(金牌导航 决策单调性优化DP-1)
  11. cudnn7.6.5下载 solitairetheme8_233小游戏下载安装赚钱-233小游戏下载安装最新版v2.29.4.5...
  12. 智能优化算法:树种算法-附代码
  13. C++:表达式求值(四则运算)实现
  14. 太极root权限_太极框架免root版下载
  15. 常见Web服务器简介
  16. Unicode双向算法详解(bidi算法)(三)
  17. MySQL小白快速入门笔记
  18. 软件测试qq是不是微信号,如何批量检测出QQ号是否开通微信?
  19. sum()函数和count()函数的区别
  20. java判断扑克牌是否为顺子_程序算法设计题,判断扑克牌中的顺子

热门文章

  1. 叶县有没有计算机培训学校,叶县中等专业学校
  2. 【译】Private Image Analysis with MPC Training CNNs on Sensitive Data
  3. 【译】 Sparky: A Lightning Network in Two Pages of Solidity
  4. GAN在Image To Image translation 和Inverse Problem中的应用
  5. Android Activity中加入View后进行后台截屏截图
  6. 关于intent-filter的误区
  7. excel打印预览在哪里_打印小心机:轮页眉页脚的重要性
  8. html怎么在页面中获取操作用户的id,CSS ID 选择器详解
  9. vue 音乐盒app_VBox 一款基于vue开发的音乐盒 序章
  10. [codevs 1743] 反转卡片