欢迎光临
我们一直在努力

ado.net详细研究(三) —— DataReader(二)-.NET教程,数据库应用

建站超值云服务器,限时71元/月

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)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ado.net详细研究(三) —— DataReader(二)-.NET教程,数据库应用
分享到: 更多 (0)