A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM朱百青 中级黑马   /  2013-5-7 23:20  /  2086 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HM朱百青 于 2013-5-9 23:13 编辑

在数据库中,有些字段是可以为空的,比如而当我们需要用ADO.NET取出来的时候,我们需要判断他是不是为DBNull,而不是判断是否为null,那么这两者有何区别呢?

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

4 个回复

倒序浏览
1. DBNull直接继承 Object ,所以 DBNull 不是 string , 不是 int , 也不是 DateTime;
2. null 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型变量的默认值。
回复 使用道具 举报
学习了~~~~
回复 使用道具 举报
二者的使用场合不一样,只需要记住在在进行于数据库相关的工作(浏览数据)时,应当使用DBNull,而不是null,如果你使用null将抛出异常。
DBNull最经典的用法如下:
//如果数据库中不存在该值
DataRow row=dt.NewRow();
DateTime? dt;
if( DBNull.Value.Equals(row["time"]) )
{
     dt=null;//如果数据库中time列不存在该值,就让dt=null。这里dt是可空类型。
}
else
{
    dt=row["time"];
}

因此DBNull最长用于检测数据库中某列是否“缺值”。

刚才是用DataRow取值,如果使用SqlDataReader取值,则可以使用SqlDataReader自己的IsDbNull方法。如下:
SqlDataReader reader=cmd.ExeDataReader();
int index=  read.GetOrdinal("time");//获取time列的序号,也就说,time列在数据库中的列索引。
if(reader.IsDbNull(index))//如果time缺值
{
   dt=null;
}
else
{
dt=reader.GetDataTime("time");
}

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
关于null,在数据库和在C#中是不一样的,在c#是表示空,没有。在数据库中表示“不知道”。所以在数据库和.net进行查询取值和插入的时候。是要用DBNull和null进行交换的。DBNull代表数据库的null。null代表c#的null。这里就说2个封装好的方法了。楼上已经很具体了。
        public static Object FromDbvalue( object obj)//从数据库中取数据,改变为C#能接受的null
        {
            if (obj == DBNull.Value)
            {
                return null;
            }
            else
            {
                return obj;
            }         
                     
        }
        public static Object ToDbvalue(object obj)//往数据库存数据,改变为数据库可接受的DBNull.Value
        {
            if (obj == null)
            {
                return DBNull.Value;
            }
            else
            {
                return obj;
            }
        }

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马