威凡网全力打造:网页编程、软件开发编程、平面设计、服务器端开发、操作系统等在线学习平台!学编程,上威凡网!
PHP教程>> PHP基础 PHP技巧 PHP实例 PHP文摘 PHP模板 PHP总结
当前位置:首页 > PHP教程 > PHP总结
上一节 下一节
 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


申明:本教程内容由威凡网编辑整理并提供IT程序员分享学习,如文中有侵权行为,请与站长联系(QQ:254677821)!
上一节 下一节
相关教程  
其他教程  
PHP基础
PHP技巧
PHP实例
PHP文摘
PHP模板
PHP总结

违法和不良信息举报中心】邮箱:254677821@qq.com
Copyright©威凡网 版权所有 苏ICP备2023020142号
站长QQ:254677821