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