c#

位置:IT落伍者 >> c# >> 浏览文章

C#中的DBNull、Null和String.Empty解释


发布日期:2022年03月03日
 
C#中的DBNull、Null和String.Empty解释

对DBNull的解释

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

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

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

DBNull 从不等于任何值

DBNull 是一个单独的类这意味着该类只能存在一个实例这个唯一的实例是 DBNullValue

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

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

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 SystemDBNullValue

null用于判断Reference invalidate

和StringEmpty

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

ConvertIsDBNull()

ConvertIsDBNull()返回有关指定对象是否为 DBNull 类型的指示即是用来判断对象是否为DBNULL的其返回值是True或Flase

DBNull在DotNet是单独的一个类型 SystemDBNull 它只有一个值 DBNullValue 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(OleDbCommandSqlCommand) 的ExecuteScalar的返回值中情况可以这样分析

select 这样返回的object是

select null 这样返回的是DBNullValue

select isnull(null) 返回的是

select top id from table 这样返回的值是null

select isnull(id) from table where = 返回的值是null

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

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

string username=cmdExecuteScalar()ToString();

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

又或者 select id from usertable where username=@name 这样的sql语句如果找不到记录那么ExecuteScalar则会返回null所以千万不要

int userid=ConvertToInt(cmdExecuteScalar());

或者你会这样写 SQL 语句select isnull(id) from usertable where username=@name

但是 int userid=ConvertToInt(cmdExecuteScalar()); 依然会出错因为上面的语句不成立时仍然是不返回任何行

对于IDbDataParameter(OleDDbParameterSqlParameter)的Value如果为null则代表该参数没有指定或者是代表DEFAULT如果为DBNullValue则代表SQL中的NULL

所以如果你要调用存储过程里面有参数 @val nvarchar()=AABB

那么cmdParameters[@val]Value=null 代表使用这个默认的 AABB

而cmdParameters[@val]Value=DBNullValue 代表使用NULL来传给 @val

你可以用ConvertIsDBNull来判断一个值是否DBNull注意ConvertIsDBNull(null)是false

               

上一篇:ADO.net中数据库连接方式

下一篇:C#实现远程线程插入