什么是 ADO 存取數據庫時(shí)的分頁(yè)顯示?如果你使用過(guò)目前眾多網(wǎng)站上的電子公告板程序的話(huà),那你應該會(huì )知道電子公告板程序為了提高頁(yè)面的讀取速度,一般不會(huì )將所有的帖子全部在一頁(yè)中羅列出來(lái),而是將其分成多頁(yè)顯示,每頁(yè)顯示一定數目的帖子數,譬如 20 條。這就是數據庫查詢(xún)的分頁(yè)顯示,如果你還不明白,去看看 yahoo 等搜索引擎的查詢(xún)結果就會(huì )明白了。
那么究竟如何才能做到將數據庫的查詢(xún)結果分頁(yè)顯示呢?其實(shí)方法有很多,但主要有兩種:
一、將數據庫中所有符合查詢(xún)條件的記錄一次性的都讀入 recordset 中,存放在內存中,然后通過(guò) ADO Recordset 對象所提供的幾個(gè)專(zhuān)門(mén)支持分頁(yè)處理的屬性: PageSize( 頁(yè)大小 )、 PageCount( 頁(yè)數目 ) 以及 AbsolutePage( 絕對頁(yè) ) 來(lái)管理分頁(yè)處理。
二、根據客戶(hù)的指示,每次分別從符合查詢(xún)條件的記錄中將規定數目的記錄數讀取出來(lái)并顯示。
兩者的主要差別在于前者是一次性將所有記錄都讀入內存然后再根據指示來(lái)依次做判斷分析從而達到分頁(yè)顯示的效果,而后者是先根據指示做出判斷并將規定數目的符合查詢(xún)條件的記錄讀入內存,從而直接達到分頁(yè)顯示的功能。
我們可以很明顯的感覺(jué)到,當數據庫中的記錄數達到上萬(wàn)或更多時(shí),第一種方法的執行效率將明顯低于第二種方法,因為當每一個(gè)客戶(hù)查詢(xún)頁(yè)面時(shí)都要將所有符合條件的記錄存放在服務(wù)器內存中,然后在進(jìn)行分頁(yè)等處理,如果同時(shí)有超過(guò) 100 個(gè)的客戶(hù)在線(xiàn)查詢(xún),那么 ASP 應用程序的執行效率將大受影響。但是,當服務(wù)器上數據庫的記錄數以及同時(shí)在線(xiàn)的人數并不是很多時(shí),兩者在執行效率上是相差無(wú)幾的,此時(shí)一般就采用第一種方法,因為第一種方法的 ASP 程序編寫(xiě)相對第二種方法要簡(jiǎn)單明了得多。
在這里作者就以我們常見(jiàn)的 ASP BBS 程序為例,來(lái)給大家分析一下如何在 BBS 程序里實(shí)現分頁(yè)顯示功能,由于我們一般使用的 BBS 程序的數據庫記錄數和同時(shí)訪(fǎng)問(wèn)的人數都不會(huì )太多,所以以下程序實(shí)例是使用的先前所介紹的第一種分頁(yè)顯示方法。
進(jìn)行 ADO 存取數據庫時(shí)的分頁(yè)顯示,其實(shí)就是對 Recordset 的記錄進(jìn)行操作。所以我們首先必須了解 Reordset 對象的屬性和方法:
BOF 屬性:目前指標指到 RecordSet 的第一筆。
EOF 屬性:目前指標指到 RecordSet 的最后一筆。
Move 方法:移動(dòng)指標到 RecordSet 中的某一條記錄。
AbsolutePage 屬性:設定當前記錄的位置是位于哪一頁(yè) AbsolutePosition 屬性:目前指標在 RecordSet 中的位置。
PageCount 屬性:顯示 Recordset 對象包括多少“頁(yè)”的數據。
PageSize 屬性:顯示 Recordset 對象每一頁(yè)顯示的記錄數。
RecordCount 屬性:顯示 Recordset 對象記錄的總數。
下面讓我們來(lái)詳細認識一下這些重要的屬性和方法
一、 BOF 與 EOF 屬性
通常我們在 ASP 程序中編寫(xiě)代碼來(lái)檢驗 BOF 與 EOF 屬性,從而得知目前指標所指向的 RecordSet 的位置,使用 BOF 與 EOF 屬性,可以得知一個(gè) Recordset 對象是否包含有記錄或者得知移動(dòng)記錄行是否已經(jīng)超出該 Recordset 對象的范圍。
如:< % if not rs.eof then ... %>< % if not (rs.bof and rs.eof) %>
若當前記錄的位置是在一個(gè) Recordset 對象第一行記錄之前時(shí), BOF 屬性返回 true,反之則返回 false。
若當前記錄的位置是在一個(gè) Recordset 對象最后一行記錄之后時(shí), EOF 屬性返回 true,反之則返回 false。
BOF 與 EOF 都為 False:表示指標位于 RecordSet 的當中。
BOF 為 True:目前指標指到 RecordSet 的第一筆記錄。 EOF 為 True:目前指標指到 RecordSet 的最后一筆記錄。
BOF 與 EOF 都為 True:在 RecordSet 里沒(méi)有任何記錄。
二、 Move 方法
您可以用 Move 方法移動(dòng)指標到 RecordSet 中的某一筆記錄,語(yǔ)法如下:
rs.Move NumRecords,Start
這里的“rs”為一個(gè)對象變量,表示一個(gè)想要移動(dòng)當當前記錄位置的 Recordset 對象;“NumRecords”是一個(gè)正負數運算式,設定當前記錄位置的移動(dòng)數目;“start”是一個(gè)可選的項目,用來(lái)指定記錄起始的標簽。
所有的 Recordset 對象都支持 Move 方法,如果 NumRecords 參數大于零,當前記錄位置向末尾的方向移動(dòng);如果其小于零,則當前記錄位置向開(kāi)頭的方向移動(dòng);如果一個(gè)空的 Recordset 對象調用 Move 方法,將會(huì )產(chǎn)生一個(gè)錯誤。
MoveFirst 方法:將當前記錄位置移至第一筆記錄。
MoveLast 方法:將當前記錄位置移至最后一筆記錄。
MoveNext 方法:將當前記錄位置移至下一筆記錄。 MovePrevious 方法:將當前記錄位置移至上一筆記錄。
Move [n] 方法:移動(dòng)指標到第 n 筆記錄, n 由 0 算起。
三、 AbsolutePage 屬性
AbsolutePage 屬性設定當前記錄的位置是位于哪一頁(yè)的頁(yè)數編號;使用 PageSize 屬性將 Recordset 對象分割為邏輯上的頁(yè)數,每一頁(yè)的記錄數為 PageSize( 除了最后一頁(yè)可能會(huì )有少于 PageSize 的記錄數 )。這里必須注意并不是所有的數據提供者都支持此項屬性,因此使用時(shí)要小心。
與 AbsolutePosition 屬性相同, AbsolutePage 屬性是以 1 為起始的,若當前記錄為 Recordset 的第一行記錄, AbsolutePage 為 1??梢栽O定 AbsolutePage 屬性,以移動(dòng)到一個(gè)指定頁(yè)的第一行記錄位置。
四、 AbsolutePosition 屬性
若您需要確定目前指標在 RecordSet 中的位置,您可以用 AbsolutePosition 屬性。
AbsolutePosition 屬性的數值為目前指標相對於第一筆的位置,由 1 算起,即第一筆的 AbsolutePosition 為 1。
注意 , 在存取 RecordSet 時(shí),無(wú)法保證 RecordSet 每次都以同樣的順序出現。
若要啟用 AbsolutePosition,必須先設定為使用用戶(hù)端 cursor( 指針 ), asp 碼如下:
rs2.CursorLocation = 3
聯(lián)系客服