這篇文章主要介紹了ADO存取數據庫時如何分頁顯示,需要的朋友可以參考下
究竟如何才能做到將數據庫的查詢結果分頁顯示呢?其實方法有很多,但主要有兩種:
一、將數據庫中所有符合查詢條件的記錄一次性的都讀入recordset 中,存放在內存中,然後通過ADO Recordset 對象所提供的幾個專門支持分頁處理的屬性: PageSize( 頁大小)、 PageCount(頁數目) 以及AbsolutePage( 絕對頁) 來管理分頁處理。
二、根據客戶的指示,每次分別從符合查詢條件的記錄中將規定數目的記錄數讀取出來並顯示。
兩者的主要差別在於前者是一次性將所有記錄都讀入內存然後再根據指示來依次做判斷分析從而達到分頁顯示的效果,而後者是先根據指示做出判斷並將規定數目的符合查詢條件的記錄讀入內存,從而直接達到分頁顯示的功能。
我們可以很明顯的感覺到,當數據庫中的記錄數達到上萬或更多時,第一種方法的執行效率將明顯低於第二種方法,因為當每一個客戶查詢頁面時都要將所有符合條件的記錄存放在服務器內存中,然後在進行分頁等處理,如果同時有超過100 個的客戶在線查詢,那麼ASP 應用程序的執行效率將大受影響。但是,當服務器上數據庫的記錄數以及同時在線的人數並不是很多時,兩者在執行效率上是相差無幾的,此時一般就採用第一種方法,因為第一種方法的ASP 程序編寫相對第二種方法要簡單明了得多。
在這裡作者就以我們常見的ASP BBS 程序為例,來給大家分析一下如何在BBS 程序裡實現分頁顯示功能,由於我們一般使用的BBS 程序的數據庫記錄數和同時訪問的人數都不會太多,所以以下程序實例是使用的先前所介紹的第一種分頁顯示方法。
進行ADO 存取數據庫時的分頁顯示,其實就是對Recordset 的記錄進行操作。所以我們首先必須了解Reordset 對象的屬性和方法:
BOF 屬性:目前指標指到RecordSet 的第一筆。
EOF 屬性:目前指標指到RecordSet 的最後一筆。
Move 方法:移動指標到RecordSet 中的某一條記錄。
AbsolutePage 屬性:設定當前記錄的位置是位於哪一頁AbsolutePosition 屬性:目前指標在RecordSet 中的位置。
PageCount 屬性:顯示Recordset 對象包括多少頁的數據。
PageSize 屬性:顯示Recordset 對象每一頁顯示的記錄數。
RecordCount 屬性:顯示Recordset 對象記錄的總數。
下面讓我們來詳細認識一下這些重要的屬性和方法
一、 BOF 與EOF 屬性
通常我們在ASP 程序中編寫代碼來檢驗BOF 與EOF 屬性,從而得知目前指標所指向的RecordSet 的位置,使用BOF 與EOF 屬性,可以得知一個Recordset 對像是否包含有記錄或者得知移動記錄行是否已經超出該Recordset 對象的範圍。
如: < % if not rs.eof then ... %>
< % if not (rs.bof and rs.eof) %>
若當前記錄的位置是在一個Recordset 對象第一行記錄之前時, BOF 屬性返回true,反之則返回false。
若當前記錄的位置是在一個Recordset 對象最後一行記錄之後時, EOF 屬性返回true,反之則返回false。
BOF 與EOF 都為False:表示指標位於RecordSet 的當中。
BOF 為True:目前指標指到RecordSet 的第一筆記錄。 EOF 為True:目前指標指到RecordSet 的最後一筆記錄。
BOF 與EOF 都為True:在RecordSet 裡沒有任何記錄。
二、 Move 方法
您可以用Move 方法移動指標到RecordSet 中的某一筆記錄,語法如下:
rs.Move NumRecords,Start
這裡的rs為一個對像變量,表示一個想要移動噹噹前記錄位置的Recordset 對象;NumRecords是一個正負數運算式,設定當前記錄位置的移動數目;start是一個可選的項目,用來指定記錄起始的標籤。
所有的Recordset 對像都支持Move 方法,如果NumRecords 參數大於零,當前記錄位置向末尾的方向移動;如果其小於零,則當前記錄位置向開頭的方向移動;如果一個空的Recordset 對象調用Move 方法,將會產生一個錯誤。
MoveFirst 方法:將當前記錄位置移至第一筆記錄。
MoveLast 方法:將當前記錄位置移至最後一筆記錄。
MoveNext 方法:將當前記錄位置移至下一筆記錄。 MovePrevious 方法:將當前記錄位置移至上一筆記錄。
Move [n] 方法:移動指標到第n 筆記錄, n 由0 算起。
三、 AbsolutePage 屬性
AbsolutePage 屬性設定當前記錄的位置是位於哪一頁的頁數編號;使用PageSize 屬性將Recordset 對象分割為邏輯上的頁數,每一頁的記錄數為PageSize( 除了最後一頁可能會有少於PageSize 的記錄數)。這裡必須注意並不是所有的數據提供者都支持此項屬性,因此使用時要小心。
與AbsolutePosition 屬性相同, AbsolutePage 屬性是以1 為起始的,若當前記錄為Recordset 的第一行記錄, AbsolutePage 為1。可以設定AbsolutePage 屬性,以移動到一個指定頁的第一行記錄位置。
四、 AbsolutePosition 屬性
若您需要確定目前指標在RecordSet 中的位置,您可以用AbsolutePosition 屬性。
AbsolutePosition 屬性的數值為目前指標相對於第一筆的位置,由1 算起,即第一筆的AbsolutePosition 為1。
注意, 在存取RecordSet 時,無法保證RecordSet 每次都以同樣的順序出現。
若要啟用AbsolutePosition,必須先設定為使用用戶端cursor( 指針), asp 碼如下:
rs2.CursorLocation = 3
五、 PageCount 屬性
使用PageCount 屬性,決定Recordset 對象包括多少頁的數據。這裡的頁是數據記錄的集合,大小等於PageSize 屬性的設定,即使最後一頁的記錄數比PageSize 的值少,最後一頁也算是PageCount 的一頁。必須注意也並不是所有的數據提供者都支持此項屬性。
六、 PageSize 屬性
PageSize 屬性是決定ADO 存取數據庫時如何分頁顯示的關鍵,使用它就可以決定多少記錄組成一個邏輯上的一頁。設定並建立一個頁的大小,從而允許使用AbsolutePage 屬性移到其它邏輯頁的第一條記錄。 PageSize 屬性能隨時被設定。
七、 RecordCount 屬性
這也是一個非常常用和重要的屬性,我們常用RecordCount 屬性來找出一個Recordset 對象包括多少條記錄。如: < % totle=RS.RecordCount %>
在了解了Recordset 對象的以上屬性和方法後,我們來考慮一下,如何運用它們來達到我們分頁顯示的目的。首先,我們可以為PageSize 屬性設置一個值,從而指定從記錄組中取出的構成一個頁的行數;然後通過RecordCount 屬性來確定記錄的總數;再用記錄總數除以PageSize 就可得到所顯示的頁面總數;最後通過AbsolutePage 屬性就能完成對指定頁的訪問。好像很並不復雜呀,下面讓我們來看看程序該如何實現呢?
我們建立這樣一個簡單的BBS 應用程序,它的數據庫中分別有以下五個字段:ID,每個帖子的自動編號;subject,每個帖子的主題;name,加帖用戶的姓名;email,用戶的電子郵件地址;postdate,加帖的時間。數據庫的DSN 為bbs。我們將顯示帖子分頁的所有步驟放在一個名為ShowList()的過程中,方便調用。程序如下:
?
- '----BBS顯示帖子分頁----
- <%SubShowList()%>
- <%
- PgSz=20'設定開關,指定每一頁所顯示的帖子數目,默認為20帖一頁
- SetConn=Server.CreateObject(ADODB.Connection)
- SetRS=Server.CreateObject(ADODB.RecordSet)
- sql=SELECT*FROMmessageorderbyIDDESC
- '查詢所有帖子,並按帖子的ID倒序排列
- Conn.Openbbs
- RS.opensql,Conn,1,1
- IfRS.RecordCount=0then
- response.write<P><center>對不起,數據庫中沒有相關信息! </center></P>
- else
- RS.PageSize=Cint(PgSz)'設定PageSize屬性的值
- Total=INT(RS.recordcount/PgSz*-1)*-1'計算可顯示頁面的總數
- PageNo=Request(pageno)
- ifPageNo=Then
- PageNo=1
- else
- PageNo=PageNo+1
- PageNo=PageNo-1
- endif
- ScrollAction=Request(ScrollAction)
- ifScrollAction=上一頁Then
- PageNo=PageNo-1
- endif
- ifScrollAction=下一頁Then
- PageNo=PageNo+1
- endif
- ifPageNo<1Then
- PageNo=1
- endif
- n=1
- RS.AbsolutePage=PageNo
- Response.Write<CENTER>
- position=RS.PageSize*PageNo
- pagebegin=position-RS.PageSize+1
- ifposition<RS.RecordCountthen
- pagend=position
- else
- pagend=RS.RecordCout
- endif
- Response.Write<P><fontcolor='Navy'><B>數據庫查詢結果:</B>
- Response.Write(共有&RS.RecordCount&條符合條件的信息,顯示&pagebegin&-&pagend&)</font></p>
- Response.Write<TABLEWIDTH=600BORDER=1CELLPADDING=4CELLSPACING=0BGCOLOR=#FFFFFF>
- Response.Write<TRBGCOLOR=#5FB5E2><FONTSIZE=2><TD><B>主題</B></TD><TD><B>用戶</B></TD><TD><B> Email</B></TD><TD><B>發布日期</B></TD></FONT><TRBGCOLOR=#FFFFFF>
- Dowhilenot(RSisnothing)
- RowCount=RS.PageSize
- DoWhileNotRS.EOFandrowcount>0
- Ifn=1then
- Response.Write<TRBGCOLOR=#FFFFFF>
- ELSE
- Response.Write<TRBGCOLOR=#EEEEEE>
- EndIf
- n=1-n%>
- <TD><spanstyle=font-size:9pt><Ahref='view.asp?key=<%=RS(ID)%>'><%=RS(subject)%></A></span> </td>
- <TD><spanstyle=font-size:9pt><%=RS(name)%></A></span></td>
- <TD><spanstyle=font-size:9pt><ahref=mailto:<%=RS(email)%>><%=RS(email)%></a></span></TD>
- <TD><spanstyle=font-size:9pt><%=RS(postdate)%></span></td>
- </TR>
- <%
- RowCount=RowCount-1
- RS.MoveNext
- Loop
- setRS=RS.NextRecordSet
- Loop
- Conn.Close
- setrs=nothing
- setConn=nothing
- %>
- </TABLE>
- <FORMMETHOD=GETACTION=list.asp>
- <INPUTTYPE=HIDDENNAME=pagenoVALUE=<%=PageNo%>>
- <%
- ifPageNo>1Then
- response.write<INPUTTYPE=SUBMITNAME='ScrollAction'VALUE='上一頁'>
- endif
- ifRowCount=0andPageNo<>Totalthen
- response.write<INPUTTYPE=SUBMITNAME='ScrollAction'VALUE='下一頁'>
- endif
- response.write</FORM>
- Endif
- %>
- <%EndSub%>