您好,欢迎访问一九零五行业门户网

DBNull和Null的区别

dbnull 类 表示不存在的值。无法继承此类。 命名空间: system 程序集: mscorlib(在 mscorlib.dll 中) dbnull 类表示一个不存在的值。例如,在数据库的表中,某一行的某列中可能不包含任何数据。即,该列被视为根本不存在,而不只是没有值。一个表示不存在
dbnull 类
表示不存在的值。无法继承此类。
命名空间: system
程序集: mscorlib(在 mscorlib.dll 中)
dbnull 类表示一个不存在的值。例如,在数据库的表中,某一行的某列中可能不包含任何数据。即,该列被视为根本不存在,而不只是没有值。一个表示不存在的列的 dbnull 对象。此外,com 互操作使用 dbnull 类来区分 vt_null 变量(指示不存在的值)和 vt_empty 变量(指示未指定的值)。
dbnull 类型是一个单独的类,这意味着只有一个 dbnull 对象存在。dbnull::.value 成员表示唯一的 dbnull对象。dbnull::.value 可用于将不存在的值显式分配给数据库字段,但大多数 ado.net 数据提供程序在字段没有有效值时会自动分配 dbnull 值。您可以通过将从数据库字段检索到的值传递给 dbnull.value.equals 方法,确定该字段值是否为 dbnull 值。然而,有些语言和数据库对象提供一些方法,可以更容易地确定数据库字段值是否为 dbnull::.value.这些方法包括 visual basic 的 isdbnull 函数、convert::.isdbnull 方法、datatablereader::.isdbnull 方法和 idatarecord::.isdbnull 方法。
请勿将面向对象的编程语言中的 nullnothingnullptrnull 引用(在 visual basic 中为 nothing) 概念与 dbnull对象混淆。在面向对象的编程语言中,nullnothingnullptrnull 引用(在 visual basic 中为 nothing) 表示不存在对某个对象的引用。dbnull 则表示未初始化的变量或不存在的数据库列。
备注
示例
下面的示例调用 dbnull.value.equals 方法,来确定联系人数据库中的数据库字段是否具有有效值。如果具有有效值,字段值将被追加到在标签中输出的字符串中。
c# 中的用法
private void outputlabels(datatable dt)
{
string label;
// iterate rows of table
foreach (datarow row in dt.rows)
{
int labellen;
label = string.empty;
label += addfieldvalue(label, row, title);
label += addfieldvalue(label, row, firstname);
label += addfieldvalue(label, row, middleinitial);
label += addfieldvalue(label, row, lastname);
label += addfieldvalue(label, row, suffix);
label += /n;
label += addfieldvalue(label, row, address1);
label += addfieldvalue(label, row, aptno);
label += /n;
labellen = label.length;
label += addfieldvalue(label, row, address2);
if (label.length != labellen)
label += /n;
label += addfieldvalue(label, row, city);
label += addfieldvalue(label, row, state);
label += addfieldvalue(label, row, zip);
console.writeline(label);
console.writeline();
}
}
private string addfieldvalue(string label, datarow row,
string fieldname)
{
if (! dbnull.value.equals(row[fieldname]))
return (string) row[fieldname] + ;
else
return string.empty;
}
初学数据库编程我们可能会有一些对空值的疑问,比如通过编程新建的一个表中所有数据皆显示为,手动添加并删除文字后又变成了空白;一个字符串类型的字段,明明没有填值,却不等于;用ado.net从数据库中取值,每遇到有的就出错……这需要我们正确认识。net和sql server中几种不同的空值.
1、真正的空值,也就是没有输入的值,可以出现在大多数类型的字段中(如果没有别的约束条件),sql server中表示为null,显示为,手工在sql server企业管理器中输入的方法是按ctrl+0.它在。net中对应system.dbnull.value.在t-sql命令中,判断一个值是不是空值,要用is null而不是= null;处理空值有个isnull函数,它使用指定的值替换null.用ado.net从数据库得到的空值无法自动转化为空字符串或nothing,须手动检测:如果得到system.dbnull.value,则赋给数据对象nothing或其它自定义的有意义的值。
2、空字符串(零长度字符串),只出现在字符串类型(如nvarchar)的字段中,sql server中表示为'',显示为空白,手工在sql server企业管理器中输入时清空一个单元格即可。它在。net中对应system.string.empty,也就是我们常用的.在t-sql命令中处理空字符串和处理一般的字符串没什么区别。用ado.net从数据库得到的空字符串也和一般的字符串没什么区别。
dbnull简介
dbnull在dotnet是单独的一个类型 system.dbnull .它只有一个值 dbnull.value .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(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
这里 executescalar 的规则就是,,返回第一列,第一行的数据。如果第一列第一行不为空,那么executescalar就直接对应的dotnet的值。如果有第一行,但是第一列为空,那么返回的是 dbnull .如果一行都没有,那么executescalar就返回null
规则就是这样的。这里容易犯的一个错误是,把executescalar返回dbnull与null的情况混淆,例如:
string username=cmd.executescalar()。tostring();
除非你认为cmd执行后,肯定至少有一行数据,否则这里就会出错。
又或者 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
其它类似信息

推荐信息