Board logo

标题: ASP中GetRows的用法详解 [打印本页]

作者: fangzhen    时间: 2009-4-22 22:17     标题: ASP中GetRows的用法详解

NextRecordset 和 GetRows 大家可能用的很少!
最近使用使用,不错的好东东!
对提高批量查询,查询纪录集不是巨海量的情况很有效果
NextRecordset 和 GetRows 是Recordset的两个属性(属性还是方法我是常溷淆是非#$#$,弄不清四下五除一)
GetRows ---> 将recordset记录集提取到一个二维数组中,我们对recordset数据的行为就转移到该数组,可以早早的断开纪录集,不用再使用元数据操作,rs.movnext, while not rs.eof等可以省掉
NextRecordset ----> 就是在一次提交多个查询,形成多个reordset结果集的情况下,提供一个离开当前工作的recordset,转移到第二个recordset的方法!
主要是用在多个SELECT形成的结果集的情况
示例如下:
dim SQL,Rs,arrA,arrB,rowsA,rowsB
'======提取数据库库记录====
(adodb.connection 的连接部分省略,假定CONN.open CONNstr)
SQL=" select Ca1,Ca2,Ca3,Ca4 from TableA " '---------------SELECTa
SQL=SQL&" select Cb1,Cb2,Cb3,Cb4,Cb5 from TableB " '-------------SELECTb
Set Rs=conn.execute(SQL)
'执行结果将有两个select 的结果集,当前第一个select的recordset处于激活状态
arrA=rs.GetRows '----------取得SElECTa Recordset的二维数组
set rs=rs.NextRecordset
'------------最关键的一步,使用Nextrecordset激活下一个recordset
arrB=rs.GetRows '----------再次取得第二个SElECTb Recordset的二维数组
Rs.close
set rs=nothing '---------尽早释放数据库对象,关闭记录集
CONN.close
set CONN=Nothing
这样,我们所有关于数据库的数据干干净净的提取完成,用最早的时间释放数据库资源
'-----------//
'========用取得的arrA arrB进行页面处理,显示数据结果======
'注意,arrA=GetRows 后得到的数组,第一维是代表列,第二维代表行
rowsA=ubound(arrA,2) '----提取arrA的第二维下标,相当于取得recordset 的记录行数
rowsB=ubound(arrB,2) '-----同上,提取arrB的第二维下标
'做数据循环:
'第一个select表的循环
ADO也提供更有效率方法来取得资料。GetRows 方法传回一个二维的阵列变数,每一行对应Recordset中的一笔记录,且每一列对应到记录中的栏位。此方法的语法如下:
varArray = rs.GetRows([Rows], [Start], [Fields])
Rows 是要读取记录的数量;如果想要取得Recordset所有记录,可用-1或省略此参数。Start 是指出第一个被读取记录的书?;也可以是下列列举常数中的一个:0-adBookmarkCurrent(目前记录)、1-adBookmarkFirst(第一笔记录)、或2-adBookmarkLast(最后记录)。
Fields 是可选择的栏位名称阵列,其用来限制要读取的资料量。(也可指定单一栏位名称、单一栏位索引、或者一个栏位索引阵列)。当设定 Rows 为少于Recordset记录笔数时,第一笔未读取的记录变成现行记录。若省略 Rows 参数或设定为-1-adGetRowsRest或大于未读取的笔数时,GetRows 方法会读取所有记录并让Recordset在EOF状态,而不会产生任何错误。
当处理目的变数阵列的资料时,应该记得资料储存方式是有点相反的感觉:阵列中第一维定义Recordset的栏位(资料行),第二维定义Recordset的资料列。以下有个载入Recordset内所有记录某三个栏位的范例:
Dim values As Variant, fldIndex As Integer, recIndex As Integer
values = rs.GetRows(, , Array("LastName", "FirstName", "BirthDate"))
For recIndex = 0 To UBound(values, 2)
    For fldIndex = 0 To UBound(values)
        Print values(fldIndex, recIndex),
    Next
    Print
Next
GetRows 方法通常比一次读一笔记录的?圈要来得快些,但使用这方法时,必须确定Recordset未包含太多记录;否则,会很容易以一个非常大的变数阵列来填满所有记忆体。基于相同的原因,得小心不要包括任何BLOB(Binary Large Object)或CLOB(Character Large Object)栏位;若如此做的化,应用程式一定会爆掉,特别是对于较大的Recordset而言。最后,记住此方法传回的变数阵列是以0为基底的;传回记录的笔数是UBound(values,2)+1,传回栏位数是UBound(value, 1)+1。
GetString 方法跟 GetRows 是类似的,不过其传回以单一字串形式存在的多重记录。GetString 语法如下:
GetString([Format], [NumRows], [ColDelimiter], [RowDelimiter], [NullExpr])
Format 是结果的格式。GetString 还可能支援更多格式,但是目前唯一支援的格式是2- adClipString,所以实际上没有任何选择。NumRows 是要取得的列数。(使用-1或省略此参数来读取所有剩下的记录。)ColDelimiter 是行的分隔字元(预设为Tab字元)。RowDelimiter 为记录的分隔字元(预设为换行字元)。NullExpr 是用来表示Null栏位的字串(预设为空字串)。文件中说明只有当Format= adClipString时,最后三个参数才可使用,但是这警告没有多大意义,因为(如之前所提)此格式是目前唯一支援的。以下有个例子,其透过 GetString 方法来将资料汇出成以分号分隔的文字档:
Dim i As Long
Open "datafile.txt" For Output As #1
For i = 0 To rs.Fields.Count _ 1          ' Export field names.
    If i > 0 Then Print #1, ";";
    Print #1, rs.Fields(i).Name;
Next
Print #1, ""
rs.MoveFirst                              ' Export data.
Print #1, rs.GetString(, , ";", VBCrLf); ' Don't add an extra CR-LF here.
Close #1
GetString 方法不允许只汇出栏位的子集合,也不允许修改汇出栏位的顺序。如果需要这些额外的功能,应该使用 GetRows 方法且自行建立结果字串。
大家应该都知道 Recordset 有个 GetRows 属性,但是真正使用的不多,我也是最近才用的!汗……
其实这个属性很简单,就是把数据集输出到一个数组中。但是实用性可不小,在这里我举一个例子说明一下GetRows的使用方法,大家举一反三能想到更多的用法!
比如一个分类的表 T_Cate,结构和数据如下:
ID   |   Title   | Intro
-----------------------------------------
1    |   新闻   | 这里是新闻
2    |   教程   | 这里是教程
3    |   下载   | 这里是下载
好了,表建立好了,数据也有了,下面我们就要用到GetRows咯!
程序代码:
Dim Rs_Cate
Dim Arr_Cate
Set Rs_Cate=Conn.ExeCute("SELECT ID,Title,Intro FROM T_Cate ORDER BY ID ASC")
Arr_Cate=Rs_Cate.GetRows
Set Rs_Cate=Nothing
好了表数据已经导出到数组了!下面我们将遍历这个数组
程序代码:
Dim Arr_CateNumS,Arr_CateNumI
Arr_CateNumS=Ubound(Arr_Cate,2) '得到数组中数据的下标
For Arr_CateNumI=0 To Arr_CateNumS
    Response.Write("ID:"&Arr_Cate(0,Arr_CateNumI)&" | 标题:"&Arr_Cate(1,Arr_CateNumI)&" | 介绍:"&Arr_Cate(2,Arr_CateNumI)&"<br>")
Next
呵呵,好了,输出的数据为:
ID:1 | 标题:新闻 | 介绍:这里是新闻
ID:2 | 标题:教程 | 介绍:这里是教程
ID:3 | 标题:下载 | 介绍:这里是下载







欢迎光临 PHP开发笔记 (http://phpvi.com/) Powered by Discuz! 6.1.0