Recordset對象的作用是由數(shù)據(jù)庫返回記錄集。根據(jù)查詢結(jié)果返回一個包含所查詢數(shù)據(jù)的記錄集,然后顯示在頁面上。因為刪除、更新、添加操作不需要返回記錄集,因此可以直接使用連接對象或是命令對象的Exexut方法,但是利用記錄集對象有時會更簡單,此外,通過記錄集對象能夠?qū)崿F(xiàn)比較復雜的數(shù)據(jù)庫管理任務,比如要采用分頁顯示記錄就必須使用記錄集對象。
Recordset對象可以用來代表表中的記錄,可以把記錄集看成是一張?zhí)摂M的表格,包含一條或多條記錄(行),每條記錄包含一個或多個字段,但任何時候只有一條記錄為當前記錄。
可以在非顯式建立連接對象的情況下,直接打開一個帶有查詢的記錄集,或是對命令對象的查詢返回一個記錄集。ADO提供這種靈活性,可以用最簡單的方式指明一個字符串來說明連接方式,從而得到數(shù)據(jù)庫的查詢結(jié)果,ADO會自動創(chuàng)建所需要的連接對象。當然也可以顯式創(chuàng)建連接對象和命令對象,這樣可以獲得更多的靈活性,實現(xiàn)更為強大的功能。
一、 建立Recordset對象
創(chuàng)建記錄集的方法主要有兩種??梢韵冉⑦B接對象,再創(chuàng)建記錄集對象;也可以在非顯式建立連接對象的情況下,創(chuàng)建記錄集對象。
第一種,先建立連接對象,再創(chuàng)建記錄集對象,用法見下面的范例。
范例6-23:先建立連接對象,再創(chuàng)建記錄集對象
<%
Set db=Server.CreateObject("ADODB.Recordset") ' 先建立連接對象
db.Open"zbsdbbszb"
Set rs=db.Execute(Select * from article) ' 建立記錄集對象rs
%>
注意:為了說明問題的方便,給記錄集對象取名為rs,本書下面的實例中記錄集對象名均為rs。
第二種,在非顯式建立連接對象的情況下,用Server對象的CreatObject方法建立并打開記錄集對象,語法如下:
Set rs=Server.CreateObject("ADODB.Recordset")
rs.Open參數(shù)
Open方法的參數(shù)見表6-16。
表6-16 Open方法的參數(shù) |
參數(shù) | 說明 |
Source | 數(shù)據(jù)庫查詢信息 |
ActiveConnection | 數(shù)據(jù)庫連接信息 |
CursorType | 記錄集中的指針類型,可選,見表6-17 |
LockType | 鎖定類型,可選,見表6-18 |
Options | 數(shù)據(jù)庫查詢信息類型,可選,見表6-19 |
CursorType參數(shù)值表6-17:
表6-17 CursorType參數(shù)值 |
參數(shù) | 值 | 說明 |
AdOpenForwardOnly | 0 | 向前指針,默認值。只能用MoveNext方法或GetRows方法向前單向移動指針,所耗系統(tǒng)資源最少,執(zhí)行速度也最快,但很多屬性和方法將不能用 |
AdOpenKeyset | 1 | 鍵盤指針,記錄集中可以前后移動。某一用戶修改數(shù)據(jù)后,其他用戶可以立即顯示,但禁止查看其他用戶添加和刪除的記錄 |
AdOpenDynamic | 2 | 動態(tài)指針,記錄集中可以前后移動。所有修改會立即在其他客戶端顯示,功能強大,但所耗系統(tǒng)資源也多 |
AdOpenStatic | 3 | 靜態(tài)指針,記錄集中可以前后移動。所有修改不會在其他客戶端顯示 |
說明:
▲ 關于指針(又稱游標)。所謂記錄集,如同一個電子表格,包含所獲取的若干記錄,每條記錄又包含若干字段。如果記錄不為空,打開記錄集后,指針指向第一條記錄??梢酝ㄟ^移動指針在記錄集中漫游,指針所指向的記錄為當前記錄,當前記錄只能有一條。
▲ 在默認情況下,當打開記錄集,為向前指針,只能用MoveNext方法向前單向移動指針,其他操作不受支持。如果需要編輯、添加和刪除記錄,想使用可前后移動的指針,并且需要看到其他用戶的對數(shù)據(jù)庫的修改,就需要使用其他類型的指針。
LockType參數(shù)值表6-18:
表6-18 LockType參數(shù)值 |
參數(shù) | 值 | 說明 |
AdLockReadOnly | 1 | 只讀,默認值,適用于僅瀏覽數(shù)據(jù) |
AdLockPessimistic | 2 | 只能同時被一個用戶所修改,修改時鎖定,完畢解鎖 |
AdLockOptimistic | 3 | 可以同時被多個用戶所修改,直到用update方法更新記錄才鎖定 |
AdLockBatchOptimistic | 4 | 數(shù)據(jù)可以被修改,且不鎖定其他用戶,指定數(shù)據(jù)成批更新 |
說明:
▲ 鎖定目的是確保數(shù)據(jù)的完整性,以防止更改被覆蓋。
▲ 當不需要修改記錄,應該使用默認的只讀記錄集,這樣執(zhí)行速度快,消耗系統(tǒng)資源少;如果是需要修改記錄,一般情況下,選擇取值2,記錄只鎖定一下,即可保護更改操作,也不消耗過多的系統(tǒng)資源。
Options參數(shù)值表6-19:
表6-19 Options參數(shù)值 |
參數(shù) | 值 | 說明 |
AdCmdUnkown | -1 | 表示CommandText參數(shù)類型無法確定,默認值 |
AdCmdText | 1 | 表示CommandText參數(shù)是命令類型 |
AdCmdTable | 2 | 表示CommandText參數(shù)是表名稱 |
AdCmdStoreProc | 3 | 表示CommandText參數(shù)是存儲過程名稱 |
范例6-24:建立記錄集對象
<%
Set rs=Server.CreateObject("ADODB. Recordset")
rs.Open" Select * from article","dsn=zbsdbbszb" ' 在Open方法中給出數(shù)據(jù)源
%>
說明:
▲ 非顯式創(chuàng)建連接對象和命令對象。
▲ Select * from article
這個查詢字符串定義后,記錄集對象會自動把它轉(zhuǎn)換到一個命令對象上。
▲ dsn=zbsdbbszb
這是創(chuàng)建連接對象的連接字符串。
二、Recordset記錄集對象的屬性
Recordset記錄集對象常用屬性見表6-20。
表6-20 Recordset記錄集對象常用屬性見表 |
屬性 | 說明 |
Source | 指示記錄集對象中數(shù)據(jù)的來源(命令對象名或SQL語句或表名) |
ActiveConnection | 連接對象名或包含數(shù)據(jù)庫的連接信息的字符串 |
CursorType | 記錄集中的指針類型,可選,見表6-16 |
LockType | 鎖定類型,可選,見表6-17 |
MaxRecors | 控制從服務器獲取的記錄集的最大記錄數(shù) |
CursorLocation | 控制數(shù)據(jù)處理是在客戶端還是在服務器端 |
Filter | 控制要顯示的內(nèi)容 |
Bof | 記錄集的開頭 |
Eof | 記錄集的結(jié)尾 |
RecordCount | 記錄集總數(shù) |
PageSize | 分頁顯示時每一頁的記錄數(shù) |
PageCount | 分頁顯示時數(shù)據(jù)頁的總頁數(shù) |
AbsolutePage | 當前指針所在的數(shù)據(jù)頁 |
AbsolutePosition | 當前指針所在的記錄行 |
Recordset記錄集對象常用屬性具體說明如下。
1.Source
用于設置數(shù)據(jù)庫的查詢信息,查詢信息可以是命令對象名或SQL語句或表名,語法如下:
rs.Source=查詢信息
2.ActiveConnection
用于設置數(shù)據(jù)庫的連接信息,連接信息可以是連接對象名或包含數(shù)據(jù)庫的連接信息的字符串,語法如下:
rs.ActiveConnection=連接信息
3.CursorType
用于設置記錄集指針類型,取值參見表6-17,語法如下:
rs.CursorType=值
默認為0,即指針只能前移。如果要讓指針自由移動,一般設為鍵盤指針1。
4. LockType
用于設置記錄集的鎖定類型。取值參見表6-18,語法如下:
rs.LockType=值
默認為1,只讀屬性。如果要利用記錄集對象進行添加、刪除、更新等操作,只能由一個用戶修改,一般需要設置其屬性為2。
5.MaxRecors
用于設定從服務器上得到的最大記錄數(shù),語法如下:
rs.MaxRecors=最大記錄數(shù)
通常這種方法不常用,而是使用SQL語句來指定所得到的最大記錄數(shù),”Select Top 整數(shù)…”。
6.CursorLocation
用于設置數(shù)據(jù)處理是在客戶端還是在服務器端。取值參見表6-21,語法如下:
rs.CursorLocation =值
表6-21 CursorLocation參數(shù)值 |
參數(shù) | 值 | 說明 |
AdUseClient | 1 | 客戶端處理 |
AdUseServer | 2 | 服務器端處理 |
AdUseClientBatch | 3 | 動態(tài)處理,在客戶端處理,處理時連接切斷,處理完畢重新連接 |
有的時候,為了減輕服務器的工作負擔,可以根據(jù)情況的需要,設置在客戶端處理。
7.Filter
用于設置要顯示的內(nèi)容。取值參見表6-22,語法如下:
rs.Filter =值
表6-22 Filter參數(shù)值 |
參數(shù) | 值 | 說明 |
AdFilterNone | 0 | 顯示所有數(shù)據(jù) |
AdFilterpendRecords | 1 | 只顯示沒有修改過的數(shù)據(jù) |
AdFilterAffectedRecords | 2 | 只顯示最近修改過的數(shù)據(jù) |
AdFilterFetchedRecords | 3 | 只顯示暫存于客戶端緩存中的數(shù)據(jù) |
8.BOF
用于判斷當前記錄指針是否在記錄集的開頭,如在開頭,返回True,否則返回Falsh。如果記錄集為空,也返回True。
9.EOF
用于判斷當前記錄指針是否在記錄集的結(jié)尾,如在結(jié)尾,返回True,否則返回Flash。如果記錄集為空,也返回True。
記錄集有兩個特殊位置:BOF和 EOF。BOF表示記錄集的開頭,位于第一條記錄之前;EOF表示記錄集結(jié)尾,位于最后一條記錄之后。BOF 為 True,當前指針指到 RecordSet 的第一條記錄; EOF 為 True,當前指標指到 RecordSet 的最后一條記錄。如果記錄集不為空,指針可以在BOF、所有記錄和EOF移動。如果記錄集為空,此時指針同時指向BOF和 EOF,它們的值均為True。
具體判斷如下:若當前記錄的位置是在一個 Recordset 對象第一行記錄之前時, BOF 屬性返回 True,反之則返回 False。;若當前記錄的位置是在一個 Recordset 對象最后一行記錄之后時,EOF 屬性返回 True,反之則返回 False;BOF 與 EOF 都為 False,表示指標位于 RecordSet 的當中;BOF 與 EOF 都為 True,在 RecordSet 里沒有任何記錄。
從以上可知,通過檢驗 BOF 與 EOF 屬性,可以得知當前指針所指向的 RecordSet 的位置,使用 BOF 與 EOF 屬性,可以得知一個 Recordset 對象是否包含有記錄或者得知移動記錄行是否已經(jīng)超出該 Recordset 對象的范圍。
判斷記集錄是否為空的代碼如下:
< %
if not rs.bof and rs.eof then ' 如果不是開頭,也不是結(jié)尾,則執(zhí)行
…
End if
%>
循環(huán)輸出記錄集記錄的代碼如下:
< %
Do while not rs.eof ' 如果沒有到達記錄集未尾,則循環(huán)輸出下面的記錄
…
Rs.MoveNext
Loop
%>
10.RecordCount
用于返回記錄集中的記錄總數(shù)。我們常用 RecordCount 屬性來找出一個 Recordset 對象包括多少條記錄。例如:
< % Rsponse.Write rs.RecordCount %>
要注意的是,使用RecordCount必須設置指針類型為鍵盤指針1或是靜態(tài)指針3。
11.PageCount
用于設置分頁顯示時數(shù)據(jù)頁的總數(shù)。使用PageCount 屬性,決定 Recordset 對象包括多少“頁”的數(shù)據(jù)。這里的“頁”是指數(shù)據(jù)記錄的集合,大小等于 PageSize 屬性的設定,即使最后一頁的記錄數(shù)比 PageSize 的值少,最后一頁也算是 PageCount 的一頁。
12. PageSize 屬性
用于設置分頁時每一頁所顯示的記錄數(shù)。PageSize 屬性是決定 ADO 存取數(shù)據(jù)庫時如何分頁顯示的關鍵,使用它就可以決定多少記錄組成一個邏輯上的“1頁”?! ?/span>
第10、11、12條屬性通常是用于分頁顯示,具體運用見下面的范例。
13.AbsolutePage
用于設置當前指針位于哪一頁。語法如下:
rs.AbsolutePage =整數(shù)值
14.AbsolutePosition
用于設置當前指針所在的記錄行。語法如下:
rs.AbsolutePosition =整數(shù)值
后面的這些屬性使用時,一般需要設置指針類型為鍵盤指針1。