datareader访问字段值和dbnull的关系

Posted on 2007-05-25 14:55  秋雨飘飘  阅读(586)  评论(0编辑  收藏  举报

访问字段的值

       2种方法。第一种是Item属性,此属性返回字段索引或者字段名字对应的字段的值。第二种是Get方法,此方法返回有字段索引指定的字段的值。有点难以理解,不是吗?不要紧,看例子就OK了。

       Item属性

       每个DataReader类都定义一个Item属性。比如现在我们有一个DataReader实例dr,对应的sql语句是select Fid,Fname from friend,则我们可以使用下面的方法取得返回的值:

         object ID = dr[“Fid”];

object Name = dr[“Fname”];

或者:

       object ID = dr[0];

object Name = dr[0];

注意索引总是从0开始的。另外也许您发现了我们使用的是object来定义对IDName,是的,Item属性返回的值是object型,但是您可以强制类型转换。

       int ID = (int)dr[“Fid”];

string Name = (string)dr[“Fname”];



记住:确保类型转换的有效性是您自己的责任,否则您将得到异常。编程中可以把下面代码写成一个函数

 if (dr[“Fname”]; == null)
      
return "Customer not found";
   
if (dr[“Fname”]; == System.DBNull.Value)
      
return "Customer found but name is null";
   
return (string) result;

或者这样处理

//对int型的处理
ID = dr["ID"== DBNull.Value ? -1 : (int)dr["ID"];
//对字符串的处理
Purchase = dr["Purchase"== DBNull.Value ? string.Empty : DateTime.Parse(dr["Purchase"].ToString()).ToShortDateString();


       Get方法

       起始我们在第一篇文章里面已经使用过改方法了。每个DataReader都定义了一组Get方法,比如GetInt32方法把返回的字段值作为.net clr 32位证书。同上面的例子一样我们用如下方式访问FidFname的值:

int ID = dr.GetInt32(0);

string Name = dr.GetString(1);

注意虽然这些方法把数据从数据源类型转化为.net数据类型,但是他们不执行其他的数据转换,比如他们不会把16位整数转换为32位的。所以您必须使用正确的Get方法。另外Get方法不能使用字段名来访问字段,也就是说上面的没有:

int ID = dr.GetInt32(“Fid”);                             //错误

string Name = dr.GetString(“Fname”);              //错误

显然上面这个缺点在某些场合是致命的,当你的字段很多的时候,或者说你过了一段时间以后再来看你这些代码,你会觉得很难以理解!当然我们可以使用其他方法来尽量解决这个问题。一个可行的办法是使用const

const int FidIndex 0

const int NameIndex 1

int ID = dr.GetInt32(FidIndex);

string Name = dr.GetString(NameIndex);

这个办法并不怎么好,另外一个好一些的办法:

int NameIndex = dr.GetOrdinal(“Fname”);       //取得Fname对应的索引值

string Name = dr.GetString(NameIndex);

这样似乎有点麻烦,但是当须要遍历阅读器种大量的结果集的时候,这个方法很有效,因为索引只需执行一次。

int FidIndex dr.GetOrdinal(“Fid”);

int NameIndex = dr.GetOrdinal(“Fname”);

while(dr.Read())

{

         int ID = dr.GetInt32(FidIndex);

         string Name = dr.GetInt32(NameIndex);

}

Copyright © 2024 秋雨飘飘
Powered by .NET 8.0 on Kubernetes