ado.net详细研究(三) ―― DataReader(二)

DataReader
1. 创建 DataReader 对象
前面提到过没有构造函数创建 DataReader 对象。通常我们使用 Command 类的 ExecuteRader 方法来创建 DataReader 对象:
SqlCommand cmd = new SqlCommand(commandText,ConnectionObject)
SqlDataReader dr = cmd.ExecuteReader();
         DataReader 类最常见的用法就是检索 Sql 查询或者存储过程返回的记录。它是连接的只向前和只读的结果集,也就是使用它时,数据库连接必须保持打开状态,另外只能从前往后遍历信息,不能中途停下修改数据。
         注意: DataReader 使用底层的连接,连接是它专有的,这意味这 DataReader 打开时不能使用对应连接进行去他操作,比如执行另外的命令等。使用完 DataReader 后一定记得关闭阅读器和连接。
       2 使用命令行为指定 DataReader 的特征
       前面我们使用 cmd.ExecuteReader() 实例化 DataReader 对象,其实这个方法有重载版本 , 接受命令行参数,这些参数应该时 Commandbehavior 枚举:
       SqlDataRader dr cmd.ExecuteReader(CommandBehavior.CloseConnection);
上面我们使用的是 CommandBehavior.CloseConnection ,作用是关闭 DataReader 的时候自动关闭对应的 ConnectionObject 。这样可以避免我们忘记关闭 DataReader 对象以后关闭 Connection 对象。别告诉我你不喜欢这个参数,你能保证你记得关闭连接。万一你忘记了呢?又或者你使用你的 partner 开发的组件来进行开发呢?这个组件并不一定让你有关闭连接的权限哦。另外 CommandBehavior.SingleRow 可以使结果集返回单个行, CommandBehavior.SingleResult 返回结果为多个结果集的第一个结果集。当然 Commandbehavior 枚举还有其他值,请参见 msdn
       3 遍历 DataReader 中的记录
       ExecuteReader 方法分会 DataReader 对象时,当前光标的位置时第一条记录的前面。必须调用数据阅读器的 Read 方法把光标移动到第一条记录,然后第一条记录就是当前记录。如果阅读器包含的记录不止一条, Read 方法返回一个 bool true 。也就是说 Read 方法的作用是在允许范围内移动光标位置到下一记录,有点类似 rs.movenext ,不是吗?如果当前光标指示着最后一条记录,此时调用 Read 方法得到 false 。我们经常这样做:
While(dr.Reader())
{
//do something with the current record
}
注意,如果你对每一条记录的操作可能花费比较长的时间,那么意味着阅读器将长时间打开,那么数据库连接也将维持长时间的打开状态。此时使用非连接的 DataSet 或许更好一些。
       4 访问字段的值
       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”];
记住:确保类型转换的有效性是您自己的责任,否则您将得到异常。
       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);
}
 
到目前为止,我们已经讨论了 DataReader 的基本操作了。至于 DataReader 的有些高级超作我们以后再讨论。
下次我们构建一个项目――个人通讯录(单用户版本)。在这个项目中我们将用到前面讨论的所有知识,同时在这个项目里面我将尽量是这个项目符合多层体系结构标准。
分享至
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别: Web开发┆阅读( 0)┆评论( 0) ┆ 返回博主首页┆ 返回博客首页
上一篇 十天学会ASP.net1,2 下一篇 ado.net详细研究(二) ―― DataReader(一)..

相关文章

  • ADO:IDispatch error 3121错误的解决
  • Adobe首席执行官谈朋友、敌人和中国
  • ADO快速入门
  • ado.net详细研究(二) ―― DataReader(一..

职位推荐

  • .NET工程师
  • .NET工程师
  • .net开发工程师
  • .net 高级开发工程师
  • .NET 开发工程师

文章评论

 
 

发表评论            

昵  称:
登录  快速注册
验证码:

点击图片可刷新验证码请点击后输入验证码博客过2级,无需填写验证码

内  容:

同时赞一个

每日博报 精彩不止一点关闭

你可能感兴趣的:(.net,职场,ADO,休闲)