黑马程序员技术交流社区

标题: DBNull与null的区别 [打印本页]

作者: HM朱百青    时间: 2013-5-7 23:20
标题: DBNull与null的区别
本帖最后由 HM朱百青 于 2013-5-9 23:13 编辑

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

作者: 许庭洲    时间: 2013-5-8 07:12
1. DBNull直接继承 Object ,所以 DBNull 不是 string , 不是 int , 也不是 DateTime;
2. null 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型变量的默认值。
作者: 郑丹丹1990    时间: 2013-5-8 08:04
学习了~~~~
作者: 王宝生    时间: 2013-5-8 13:16
二者的使用场合不一样,只需要记住在在进行于数据库相关的工作(浏览数据)时,应当使用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");
}

作者: 郎吉祥    时间: 2013-5-8 13:40
关于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;
            }
        }




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2