`
weixing
  • 浏览: 79877 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[C#] DBNull、Null和String.Empty的区别

    博客分类:
  • .NET
阅读更多

[C#] DBNull、Null和String.Empty的区别

 

对DBNull的解释:

    该类用于指示不存在某个已知值(通常在数据库应用程序中)。

    在数据库应用程序中,空对象是字段的有效值。该类区分空值(空对象)和未初始化值(DBNull.Value   实例)。例如,表可以包含具有未初始化字段的记录。默认情况下,这些未初始化字段具有   DBNull   值。

    该类还可以用于在   COM   Interop   中区分  VT_NULL   变量(与空对象关联)和   VT_EMPTY   变量(与   DBNull.Value   实例关联)。

    DBNull   从不等于任何值。

    DBNull   是一个单独的类,这意味着该类只能存在一个实例。这个唯一的实例是   DBNull.Value。 中国网管联盟www_bitscn_com

    访问   SQL   数据库的数据密集应用程序必须使用   System.Data.SqlTypes   类,这些类对空值具有内在支持。

    DBNull在DotNet是单独的一个类型,该类只能存在唯一的实例,DBNULL.Value,DBNull唯一作用是可以表示数据库中的字符串,数字,或日期,为什么可以表示原因是DotNet储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。对于 DataRow , 它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。 要么就是 DBNull 。 所以 row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException。DBNull 实现了 IConvertible 。但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。 54ne.com

 

Null

    null 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果 int i=null,的话,是不可以的,因为Int是值类型的。
    "null"   means   the   object   reference   is   invalid   in   .NET,   when   you   retrieve   a   NULL   value   from   the   Database,   it   is   a   valid   value   to   .NET,   and   it   is   represented   by   System.DBNull.Value
    null用于判断Reference   invalidate

 

 ""和String.Empty

 

    这两个都是表示空字符串,其中有一个重点是string str1="" 和 string str2=null 的区别,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,string str2=null,这样定义后,只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。

 

Convert.IsDBNull()

 

    Convert.IsDBNull()返回有关指定对象是否为 DBNull 类型的指示,即是用来判断对象是否为DBNULL的。其返回值是True或Flase。 中国网管联盟www.bitscn.com
    DBNull在DotNet是单独的一个类型 System.DBNull 。它只有一个值 DBNull.Value 。DBNull 直接继承 Object ,所以 DBNull 不是 string , 不是 int , 也不是 DateTime 。。。

    但是为什么 DBNull 可以表示数据库中的字符串,数字,或日期呢?原因是DotNet储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。 中国网管联盟www、

    对于 DataRow , 它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值。要么就是 DBNull 。 所以 row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException。

    DBNull 实现了 IConvertible 。 但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。

  

数据库操作与DBNull和Null

  在 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 中国网管联盟www.bitscn.com

    这里 ExecuteScalar 的规则就是,返回第一列,第一行的数据。如果第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。如果有第一行,但是第一 列为空,那么返回的是 DBNull 。如果一行都没有,那么ExecuteScalar就返回null

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

    string username=cmd.ExecuteScalar().ToString(); 中国网管联盟www.bitscn.com

    除非你认为cmd执行后,肯定至少有一行数据,否则这里就会出错。 网管联盟www.bitsCN.com

    又或者 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。
分享到:
评论

相关推荐

    asp.net中DBNull.Value,null,String.Empty区别浅析

    来给大家介绍asp.net中DBNull.Value,null,String.Empty区别浅析,有需要的同学可以参考一下

    C#中SQL参数传入空值报错解决方案

    C#中的null与SQL中的NULL是不一样的,SQL中的NULL用C#表示出来就是DBNull.Value。 注意:SQL参数是不能接受C#的null值的,传入null就会报错。 下面我们看个例子: SqlCommand cmd=new SqlCommand(Insert into ...

    CoffeeTable:类似于 C# DataTable 或 R data.frame 的 Java 数据结构。 包括向量运算、矩阵变换、高级排序运算和子集条件,以及其他特定于矩阵的方法

    但是,一个特殊的类 TheoreticalValue(类似于 C# DBNull)将替换空字段、NA 字段和无限值,允许简单的算术函数同时避免 NullPointerExceptions,否则不会影响您的操作。 该库还为 DataTable 的超类 ...

    CMS.DBUtility.dll

    if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { cmdresult = 0; } else { cmdresult = int.Parse(obj.ToString()); } if (cmdresult == 0) { return false; } else ...

    对象不能从 DBNull 转换为其他类型

    一个转化错误,对象不能从 DBNull 转换为其他类型

    Silverlight DataSet

    需要下载:Silverlight.DataSet和Silverlight.DataSetConnector ...此DataTable中存入的数据不是object类型的,而全是string类型的,如果数据库中存的值为null,那么取出来的值是null而不是DbNull.Value.

    c#读取图像保存到数据库中(数据库保存图片)

    代码如下:注:MyTools.g_PhotoField为数据库表中的图象字段名称//将图片保存到数据库中 if(this.picPhoto.Image==null) { m_DataRow[MyTools.g_PhotoField]=DBNull.Value; } else { try { MemoryStream ms = ...

    解析java中This的用法分析

    本篇文章是对java中This的用法进行了详细的分析介绍,需要的朋友参考下

    浅谈C# 中的可空值类型 null

    主要介绍了C# 中的可空值类型 null,有需要的朋友可以参考一下

    C#三种判断数据库中取出的字段值是否为空(NULL) 的方法

    1 通过System.DBNull判断,网上大部分都使用这个方法。 代码如下:DataTable dt; //假设字段为name, dt已经保存了数据dt.rows[0][“name”] == System.DBNull.Value; //判断第一行数据的name字段是否为空 2 通过Is...

    SqlScope数据层

    有兴趣的看SqlScopeImpl.CreateCommand方法的代码如果附加参数为null,那么将以DBNull.Value插入到SqlParameter中。提示:在Main中选择例子来运行。最好先打开SqlServer事件探查器来监视程序对SqlServer的操作活动。...

    ADO.NET三层架构和数据库DBNull问题

    二、 创建C# Winform工程  三、添加具体业务功能代码 1、创建三层架构 2、查询数据表中的数据总条数 3、删除数据表中指定ID的数据 4、向数据库中插入数据  5、向数据库中插入Null的问题 6、读取指定ID号的数据 7、...

    C#实现的数据库源代码

    parameter.Value = DBNull.Value; return parameter; } private OracleType ToOracleDbType(Type type) { if (type.BaseType == typeof(Enum)) { type = Enum.GetUnderlyingType(type); } int index = ...

    c#可空类型的作用说明

    可空类型用途主要是从数据库读取数据有可能为空,而不是插入使用,插入数据都要进行验证,如果要插入数据库的null,则使用DBNull.value 判断取出的数据是否为数据库中的null,如果是则赋值给可空的datetime类型的...

    区分JS中的undefined,null,,0和false

    在程序语言中定义的各种各样的数据类型中,我们都会为其定义一个”空值”或”假值”,比如对象类型的空值null,.NET Framework中数据库字段的空值DBNull,boolean类型的假值false等等。在JavaScript中也有很多种的...

    升级的C#的《日记本Note》

    升级的C#的《日记本Note》 关于日记本Note程序 Version 1.0 软件信息: 软件名称:日记本Note 版 本 号:Version 1.0 授权类型:免费软件 使用平台:2000/xp/2003 软件语言:简体中文 下载地址:...

    EF连接MySql 5.7存在的坑

    使用Entity Framework 6.1.X连接MySQL5.7存在的几个问题的解决办法. 1.选择EF版本,弹出Your ...2.选择EF6.x之后,选择映射数据库对应的表后,弹出 "The value for column 'IsPrimaryKey' in talbe 'XX' is DBNull.

    spring.net中文手册在线版

    17.9. Mapping DBNull values 17.10. Basic data access operations 17.10.1. ExecuteNonQuery 17.10.2. ExecuteScalar 17.11. Queries and Lightweight Object Mapping 17.11.1. ResultSetExtractor 17.11.2. ...

Global site tag (gtag.js) - Google Analytics