访问字段的值
有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来定义对ID和Name,是的,Item属性返回的值是object型,但是您可以强制类型转换。
int ID = (int)dr[“Fid”];
string Name = (string)dr[“Fname”];
记住:确保类型转换的有效性是您自己的责任,否则您将得到异常。编程中可以把下面代码写成一个函数
return "Customer not found";
if (dr[“Fname”]; == System.DBNull.Value)
return "Customer found but name is null";
return (string) result;
或者这样处理
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位证书。同上面的例子一样我们用如下方式访问Fid和Fname的值:
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);
}