GetRows的用法詳解

2021-08-22 08:00:45 字數 3583 閱讀 4103

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 " '---------------selectasql=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.closeset rs=nothing '---------盡早釋放資料庫物件,關閉記錄集conn.closeset 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 integervalues = rs.getrows(, , array("lastname", "firstname", "birthdate"))for recindex = 0 to ubound(values, 2) for fldindex = 0 to ubound(values) print values(fldindex, recindex), next printnext

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 longopen "datafile.txt" for output as #1for i = 0 to rs.fields.count _ 1 ' export field names. if i > 0 then print #1, ";"; print #1, rs.fields(i).name;nextprint #1, ""rs.movefirst ' export data.print #1, rs.getstring(, , ";", vbcrlf); ' don't add an extra cr-lf here.close #1

getstring 方法不允許只匯出欄位的子集合,也不允許修改匯出欄位的順序。如果需要這些額外的功能,應該使用 getrows 方法且自行建立結果字串。

程式**:

dimrs_catedimarr_catesetrs_cate=conn.execute("selectid,title,introfromt_cateorderbyidasc")arr_cate=rs_cate.getrowssetrs_cate=nothing好了表資料已經匯出到陣列了!下面我們將遍歷這個陣列

程式**:

GetRows的用法詳解!

大家應該都知道 recordset 有個 getrows 屬性,但是真正使用的不多,我也是最近才用的!汗 比如乙個分類的表 t cate,結構和資料如下 id title intro 1 新聞 這裡是新聞 2 教程 這裡是教程 好了,表建立好了,資料也有了,下面我們就要用到getrows咯!程式 d...

typedef struct的用法 詳解!!

typedef為c語言的關鍵字,作用是為一種資料型別定義乙個新名字。這裡的資料型別包括內部資料型別 int,char等 和自定義的資料型別 struct等 在程式設計中使用typedef目的一般有兩個,乙個是給變數乙個易記且意義明確的新名字,另乙個是簡化一些比 較複雜的型別宣告。至於typedef有...

rpm的用法詳解

rpm的用法詳解 2009 03 31 18 56 2.如何安裝.src.rpm軟體包 有些軟體包是以.src.rpm結尾的,這類軟體包是包含了源 的rpm包,在安裝時 需要進行編譯。這類軟體包有兩種安裝方法,方法一 1.執行rpm i your package.src.rpm 2.cd usr s...