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

原创 2004年04月08日 21:30:00

DataReader<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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方法返回一个booltrue。也就是说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来定义对IDName,是的,Item属性返回的值是object型,但是您可以强制类型转换。

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

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

记住:确保类型转换的有效性是您自己的责任,否则您将得到异常。

       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);

}

 

到目前为止,我们已经讨论了DataReader的基本操作了。至于DataReader的有些高级超作我们以后再讨论。

下次我们构建一个项目——个人通讯录(单用户版本)。在这个项目中我们将用到前面讨论的所有知识,同时在这个项目里面我将尽量是这个项目符合多层体系结构标准。

ADO.net入门(三):送上礼物讨欢喜

成功连接到数据库,意味着用户到数据库是一条平坦的大桥,就可以发送自己的意愿,要求数据库返回相应的结果。 于是,第二步就是向数据库发出自己的意愿和礼物。 可以发送...
  • u014366427
  • u014366427
  • 2014年03月26日 11:04
  • 543

C#二十四 Ado.Net简介

ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveX Data Objects的缩写。ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一个面向对象的数据访问架构,用...
  • zhangchen124
  • zhangchen124
  • 2016年05月07日 18:50
  • 1595

三元组,二元组,排列组合

""" 算法题:二元组 Given an array of integers, return indices of the two numbers such that they add...
  • qq_36022260
  • qq_36022260
  • 2017年12月11日 23:32
  • 49

一起研究ORB-SLAM(二)---Tracking线程

转载自 一起研究ORB-SLAM(二) 上一篇文章我讲述就ORB-SLAM的基本流程,还记得ORB-SLAM分为哪三个主要的线程吗?在脑子里头大声的所出来吧,Tracking、LOCAL MAP...
  • u013474432
  • u013474432
  • 2016年11月13日 17:19
  • 1521

DataReader 性能研究

转载自 随着 .NET 平台上,LINQ、ORM 框架、Dynamic Data、... 各种数据访问技术不断推陈出新,程序员也一直追着新技术跑,但对底层和代码细节却越来越难以掌控。当项...
  • daonidedie
  • daonidedie
  • 2014年11月21日 09:49
  • 426

用data.DataReader读取股价数据并分析--python学习笔记17

#加载相应的包 import numpy as np import pandas as pd from pandas_datareader import data,wb  #从互联网读入数据 ...
  • qq_26948675
  • qq_26948675
  • 2016年12月08日 16:14
  • 7065

黑马程序员_ADO.NET通过DataReader快速访问数据库

------- Windows Phone 7手机开发、.Net培训、期待与您交流! ------- ADO.NET另外一种访问数据库的模式是使用SqlDataReader以连接模式访问...
  • woshishe
  • woshishe
  • 2013年03月01日 17:20
  • 238

【Ado.Net】基础知识+简单实例

为什么要学Ado.Net?  作为程序员,我们一般都可以在Sql Server 的查询分析器里面查看和操作数据库中的数据。但是普通的用户如果要查看和操作数据库中的数据,在查询分析器里面就不会了,我们不...
  • Gnd15732625435
  • Gnd15732625435
  • 2017年02月04日 21:59
  • 348

Caffe 源码阅读笔记 [数据读入和处理] DataReader和DataTransformer

概述这一篇主要阅读Caffe如何从数据源读取训练数据和如何对训练数据进行变换。DataReaderDataReader通过LayerParameter获取配置信息。一个训练数据集可以读取到多个GPU(...
  • acmwwy
  • acmwwy
  • 2016年09月23日 17:16
  • 261

[原]C#:读取数据DataReader

DataReader对象是数据读取器对象,提供只读向前的游标。如果应用程序需要每次从数据库中取出最新的数据,或者只是需要快速读取数据,并不需要修改数据,那么就可以使用DataReader对象进行读取。...
  • u012141979
  • u012141979
  • 2015年12月25日 21:28
  • 1478
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ado.net详细研究(三) —— DataReader(二)
举报原因:
原因补充:

(最多只允许输入30个字)