`
weixing
  • 浏览: 81742 次
  • 性别: 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`的区别至关重要,因为它们在处理数据和字符串操作时有不同的含义和用途。以下是对这三个概念的详细解析: 1. **DBNull.Value**: DBNull.Value是...

    C#连接数据库——Database.cs(类)

    如果查询结果为`null`或`DBNull.Value`,则返回`null`;否则返回查询结果。此方法适用于那些只需要一个值的查询场景,如查询计数器或特定值。 ### 总结 通过以上分析,我们可以看出`Database.cs`类是一个功能全面...

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

    例如,在C#中,当我们尝试将DBNull.Value转换为int、string或其他任何类型时,就会引发此异常。这主要是因为DBNull.Value不是一个实际的对象实例,而是一种特殊标记,用于表示数据行中的特定列包含数据库NULL值。 #...

    C#Newtonsoft.json类库

    Newtonsoft.Json支持对DBNull、自定义类型、接口、泛型等复杂类型的序列化和反序列化,只需添加适当的转换器。 6. Json.NET的LINQ扩展: 使用`Json.Linq.JObject`和`Json.Linq.JArray`,可以对JSON数据进行查询和...

    asp.net中对数据库表插入null空值的问题

    ### ASP.NET中对数据库表插入NULL空值的问题 在ASP.NET开发过程中,向数据库表插入数据时遇到NULL值处理不当的...通过上述方法,可以有效地解决ASP.NET中数据库表插入NULL空值的问题,提高应用程序的稳定性和可靠性。

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

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

    c#数据库.docx

    总结起来,通过上述知识点的学习,我们可以更好地理解和掌握如何使用C#进行数据库操作,包括事务处理、动态SQL构建、存储过程调用、查询分页以及正确处理NULL值等关键方面。这些技能对于开发高效稳定的应用程序至关...

    将datatable里的数据导出DBF文件

    - 检查每列数据是否为`null`,如果为`null`则用`DBNull.Value`替换,这是因为DBF文件不支持直接存储`null`值。 - 代码示例: ```csharp for (int i = 0; i < dt.Rows.Count; i++) { DataRow dr = dt1.NewRow()...

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

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

    C#实现改变DataGrid某一行和单元格颜色的方法

    在C#中,改变DataGrid的行和单元格颜色通常涉及到对WPF的DataGrid控件的操作,包括数据源的绑定、行和单元格的获取以及样式设置。以下是一个详细的步骤来实现这一功能: 1. **添加DataGrid控件**: 在XAML文件中,...

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

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

    C# Json格式的转换

    在实际应用中,我们还需要注意JSON与C#数据类型的对应关系,例如JSON的`null`在C#中可能对应`null`、`default(T)`或者`DBNull.Value`。此外,Json.NET还提供了动态JSON对象(`JObject`)和JSON数组(`JArray`),它们...

    C#_SQLite操作类库

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

    c#往sqlserver2000数据库中插入时间型数据的空值

    然后,我们添加了一个`SqlParameter`,名为`@DateTimeValue`,类型设置为`SqlDbType.DateTime`,并将其值设置为`DBNull.Value`,这代表SQL中的`NULL`。最后,我们执行`ExecuteNonQuery()`来执行命令,从而将空值插入...

    C#类型转换,汉字和Email判断

    本文将基于提供的代码片段来深入探讨C#中的几种常见类型转换方法,以及如何进行汉字和Email的判断。 #### 类型转换:字符串与整型 在提供的代码片段中,`Ctype`类提供了两个用于字符串转换的方法:`Cstr`和一个...

    C#中oracle数据库的操作方法汇总

    在C#中与Oracle数据库进行交互是常见的任务,本文将详细介绍两种主要的连接方式、事务处理、命令参数的创建以及如何使用数据集显示查询结果。这些知识点对于开发C#应用程序并需要与Oracle数据库进行交互的开发者来说...

    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 ...

    c#反射机制的一种使用

    在C#编程中,反射是一种强大的机制,它允许运行时检查和操作程序集、类型、方法、属性等元数据。本篇文章将详细讲解如何利用C#的反射机制将数据库中的字段动态地绑定到用户界面(UI)控件上,以实现更灵活的数据展示...

    C#中企业库及其使用方法

    ### C#中企业库及其使用方法 #### 一、企业库简介 Enterprise Library 是由 Microsoft Patterns & Practices 团队开发的一套组件集,用于帮助开发者更高效地构建可扩展、可维护的应用程序。Enterprise Library 2.0...

Global site tag (gtag.js) - Google Analytics