DBNULL和NULL【转载】

Null是.net中无效的对象引用。

DBNull是一个类。DBNull.Value是它唯一的实例。它指数据库中数据为空(<NULL>)时,在.net中的值。

null表示一个对象的指向无效,即该对象为空对象。

DBNull.Value表示一个对象在数据库中的值为空,或者说未初始化,DBNull.Value对象是指向有效的对象。

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

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

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

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

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

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

或者你会这样写 SQL 语句:select isnull(id,0) from usertable where [email protected]

但是 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,也就是说null跟DBNull.Value是不等的。

【转载】http://www.cnblogs.com/chen-fan/articles/2171399.html

时间: 2024-10-13 16:45:34

DBNULL和NULL【转载】的相关文章

DBNULL和NULL

假设存在DataRow的实例row,那么row[column].ToString() 这个写法会不会在ToString那里发生NullReferenceException? 如果你的回答是:永远不会的话,你可以不需要看下面的文章了. Null是.net中无效的对象引用. DBNull是一个类.DBNull.Value是它唯一的实例.它指数据库中数据为空(<NULL>)时,在.net中的值. null表示一个对象的指向无效,即该对象为空对象. DBNull.Value表示一个对象在数据库中的值为

DBNULL与null的区别

Null是.net中无效的对象引用. DBNull是一个类.DBNull.Value是它唯一的实例.它指数据库中数据为空(<NULL>)时,在.net中的值. null表示一个对象的指向无效,即该对象为空对象. DBNull.Value表示一个对象在数据库中的值为空,或者说未初始化,DBNull.Value对象是指向有效的对象. DBNull在DotNet是单独的一个类型 System.DBNull .它只有一个值 DBNull.Value .DBNull 直接继承 Object ,所以 DB

DBNull和Null的区别

DBNull.Value,, 是适用于向数据库的表中插入空值.而 null,是指在程序中表示空引用. 或者对象为空.就是没有实例化. row[column]的值为DBNull.Value的话,至少说明它是从数据库中取到值了,对应了数据库中的空值: 但如果row[column]的值为null的话,说明没有从数据库中取到值. DBNull.Value是一个有着内存地址的具体类型的值,映射了数据库中的null值: 而NULL则是空指向,不存在对应的内存地址.任何对象赋值为null后,内存就释放了.版权

转载 C# BindingSource

1.引言 BindingSource组件是数据源和控件间的一座桥,同时提供了大量的API和Event供我们使用.使用这些API我们可以将Code与各种具体类型数据源进行解耦:使用这些Event我们可以洞察数据的变化.2.简单绑定 DataTable myTable = myTableAdapter.GetData();//创建Table BindingSource myBindingSource= new BindingSource();//创建BindingSource DataGridVie

IOS之nil、Nil、NSULL、NULL之间的区别

其实早就想研究一下nil.Nil.NULL和NSNull之间的区别,只是工作上除了nil,其它的几乎少有用到,所以一直拖到今天.有时候感觉自己越来越浮躁,对细微处的知识理解不够深入,因此这里给自己提个醒--在以后的工作当中要始终保持一种钻研的精神! 言归正传,我们来分别介绍一下这四种类型: 一.nil 我们给对象赋值时一般会使用object = nil,表示我想把这个对象释放掉: 或者对象由于某种原因,经过多次release,于是对象引用计数器为0了,系统将这块内存释放掉,这个时候这个对象为ni

DBNull

1. Null不是0.不是空,是"不知道".数据库中int是可以为null的,但是C#中int不可以为null,存在一个不匹配的问题. 2. 介绍"可控数据类型",string.Person(引用类型)等是可null的,但是int.bool.datetime(值类型) 是不可为null,在不可空类型后加"?"就是可空类型了,HasValue.Value. 3. DBNull和null的区别:如果值为null,直接写null的话用SqlParame

Oracle not in查不到应有的结果(NULL、IN、EXISTS详解)

问题: 语句1 : Select   *   from   table1 A  where  A.col1  not   in  (  select  col1  from  table2 B )  转载注明出处:http://x- spirit.iteye.com/.http: //www.blogjava.net/zhangwei217245/ 如果这样,本来应该有一条数据,结果没有. 如果我改写成这样: 语句2 : select   *   from table1 A where   no

SqlParameter.Value = NULL 引发的数据库异常

摘自:http://www.cnblogs.com/ccweb/p/3403492.html using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = new SqlConnection(@"Data Source=PC201305032338\SQLEXPRESS;Initial Catalog=DBTest;Integrated Security=True"); ; cmd.Connection.Open(); cmd

C# DataRow 比较

/// <summary> /// dataRow比较 /// </summary> /// <param name="drA"></param> /// <param name="drB"></param> /// <param name="columnNames">需要比较的列</param> /// <returns></ret