?? asp分頁顯示詳論.txt
字號:
asp分頁顯示詳論
asp分頁顯示詳論
eNet學(xué)院
如果你使用過目前眾多網(wǎng)站上的電子公告板程序的話,那你應(yīng)該會知道電子公告板程序為了提高頁面的讀取速度,
一般不會將所有的帖子全部在一頁中羅列出來,而是將其分成多頁顯示,每頁
顯示一定數(shù)目的帖子數(shù),譬如 20 條。想不想了解如何實現(xiàn)分頁顯示?請看
本文!
那么究竟如何才能做到將數(shù)據(jù)庫的查詢結(jié)果分頁顯示呢?其實方法有很多,
但主要有兩種:
一、將數(shù)據(jù)庫中所有符合查詢條件的記錄一次性的都讀入 recordset 中,
存放在內(nèi)存中,然后通過 ADO Recordset 對象所提供的幾個專門支持分頁處
理的屬性: PageSize( 頁大小 )、 PageCount( 頁數(shù)目 ) 以及
AbsolutePage( 絕對頁 ) 來管理分頁處理。
二、根據(jù)客戶的指示,每次分別從符合查詢條件的記錄中將規(guī)定數(shù)目的記
錄數(shù)讀取出來并顯示。
兩者的主要差別在于前者是一次性將所有記錄都讀入內(nèi)存然后再根據(jù)指示
來依次做判斷分析從而達到分頁顯示的效果,而后者是先根據(jù)指示做出判斷并
將規(guī)定數(shù)目的符合查詢條件的記錄讀入內(nèi)存,從而直接達到分頁顯示的功能。
我們可以很明顯的感覺到,當(dāng)數(shù)據(jù)庫中的記錄數(shù)達到上萬或更多時,第一
種方法的執(zhí)行效率將明顯低于第二種方法,因為當(dāng)每一個客戶查詢頁面時都要
將所有符合條件的記錄存放在服務(wù)器內(nèi)存中,然后在進行分頁等處理,如果
同時有超過 100 個的客戶在線查詢,那么 ASP 應(yīng)用程序的執(zhí)行效率將大受
影響。但是,當(dāng)服務(wù)器上數(shù)據(jù)庫的記錄數(shù)以及同時在線的人數(shù)并不是很多時,
兩者在執(zhí)行效率上是相差無幾的,此時一般就采用第一種方法,因為第一種
方法的 ASP 程序編寫相對第二種方法要簡單明了得多。
在這里作者就以我們常見的 ASP BBS 程序為例,來給大家分析一下如何
在 BBS 程序里實現(xiàn)分頁顯示功能,由于我們一般使用的 BBS 程序的數(shù)據(jù)庫
記錄數(shù)和同時訪問的人數(shù)都不會太多,所以以下程序?qū)嵗鞘褂玫南惹八榻B
的第一種分頁顯示方法。
進行 ADO 存取數(shù)據(jù)庫時的分頁顯示,其實就是對 Recordset 的記錄
進行操作。所以我們首先必須了解 Reordset 對象的屬性和方法:
BOF 屬性:目前指標指到 RecordSet 的第一筆。
EOF 屬性:目前指標指到 RecordSet 的最后一筆。
Move 方法:移動指標到 RecordSet 中的某一條記錄。
AbsolutePage 屬性:設(shè)定當(dāng)前記錄的位置是位于哪一頁
AbsolutePosition 屬性:目前指標在 RecordSet 中的位置。
PageCount 屬性:顯示 Recordset 對象包括多少“頁”的數(shù)據(jù)。
PageSize 屬性:顯示 Recordset 對象每一頁顯示的記錄數(shù)。
RecordCount 屬性:顯示 Recordset 對象記錄的總數(shù)。
下面讓我們來詳細認識一下這些重要的屬性和方法
一、 BOF 與 EOF 屬性
通常我們在 ASP 程序中編寫代碼來檢驗 BOF 與 EOF 屬性,從而得知
目前指標所指向的 RecordSet 的位置,使用 BOF 與 EOF 屬性,可以得知
一個 Recordset 對象是否包含有記錄或者得知移動記錄行是否已經(jīng)超出該
Recordset 對象的范圍。
如: < % if not rs.eof then ... %>
< % if not (rs.bof and rs.eof) %>
若當(dāng)前記錄的位置是在一個 Recordset 對象第一行記錄之前時, BOF
屬性返回 true,反之則返回 false。
若當(dāng)前記錄的位置是在一個 Recordset 對象最后一行記錄之后時,
EOF 屬性返回 true,反之則返回 false。
BOF 與 EOF 都為 False:表示指標位于 RecordSet 的當(dāng)中。
BOF 為 True:目前指標指到 RecordSet 的第一筆記錄。
EOF 為 True:目前指標指到 RecordSet 的最后一筆記錄。
BOF 與 EOF 都為 True:在 RecordSet 里沒有任何記錄。
二、 Move 方法
您可以用 Move 方法移動指標到 RecordSet 中的某一筆記錄,語法如下:
rs.Move NumRecords,Start
這里的“rs”為一個對象變量,表示一個想要移動當(dāng)當(dāng)前記錄位置的
Recordset 對象;“NumRecords”是一個正負數(shù)運算式,設(shè)定當(dāng)前記錄位置
的移動數(shù)目;“start”是一個可選的項目,用來指定記錄起始的標簽。
所有的 Recordset 對象都支持 Move 方法,如果 NumRecords 參數(shù)
大于零,當(dāng)前記錄位置向末尾的方向移動;如果其小于零,則當(dāng)前記錄位置
向開頭的方向移動;如果一個空的 Recordset 對象調(diào)用 Move 方法,將會
產(chǎn)生一個錯誤。
MoveFirst 方法:將當(dāng)前記錄位置移至第一筆記錄。
MoveLast 方法:將當(dāng)前記錄位置移至最后一筆記錄。
MoveNext 方法:將當(dāng)前記錄位置移至下一筆記錄。
MovePrevious 方法:將當(dāng)前記錄位置移至上一筆記錄。
Move [n] 方法:移動指標到第 n 筆記錄, n 由 0 算起。
三、 AbsolutePage 屬性
AbsolutePage 屬性設(shè)定當(dāng)前記錄的位置是位于哪一頁的頁數(shù)編號;
使用 PageSize 屬性將 Recordset 對象分割為邏輯上的頁數(shù),每一頁的記錄
數(shù)為 PageSize( 除了最后一頁可能會有少于 PageSize 的記錄數(shù) )。這里
必須注意并不是所有的數(shù)據(jù)提供者都支持此項屬性,因此使用時要小心。
與 AbsolutePosition 屬性相同, AbsolutePage 屬性是以 1 為起始
的,若當(dāng)前記錄為 Recordset 的第一行記錄, AbsolutePage 為 1。可以
設(shè)定 AbsolutePage 屬性,以移動到一個指定頁的第一行記錄位置。
四、 AbsolutePosition 屬性
若您需要確定目前指標在 RecordSet 中的位置,您可以用
AbsolutePosition 屬性。
AbsolutePosition 屬性的數(shù)值為目前指標相對於第一筆的位置,由 1
算起,即第一筆的 AbsolutePosition 為 1。
注意 , 在存取 RecordSet 時,無法保證 RecordSet 每次都以同樣的
順序出現(xiàn)。
若要啟用 AbsolutePosition,必須先設(shè)定為使用用戶端
cursor( 指針 ), asp 碼如下:
rs2.CursorLocation = 3
五、 PageCount 屬性
使用 PageCount 屬性,決定 Recordset 對象包括多少“頁”的數(shù)據(jù)。
這里的“頁”是數(shù)據(jù)記錄的集合,大小等于 PageSize 屬性的設(shè)定,即使最后
一頁的記錄數(shù)比 PageSize 的值少,最后一頁也算是 PageCount 的一頁。
必須注意也并不是所有的數(shù)據(jù)提供者都支持此項屬性。
六、 PageSize 屬性
PageSize 屬性是決定 ADO 存取數(shù)據(jù)庫時如何分頁顯示的關(guān)鍵,使用它
就可以決定多少記錄組成一個邏輯上的“一頁”。設(shè)定并建立一個頁的大小,
從而允許使用 AbsolutePage 屬性移到其它邏輯頁的第一條記錄。
PageSize 屬性能隨時被設(shè)定。
七、 RecordCount 屬性
這也是一個非常常用和重要的屬性,我們常用 RecordCount 屬性來找出
一個 Recordset 對象包括多少條記錄。如:
< % totle=RS.RecordCount %>
在了解了 Recordset 對象的以上屬性和方法后,我們來考慮一下,
如何運用它們來達到我們分頁顯示的目的。首先,我們可以為 PageSize 屬性
設(shè)置一個值,從而指定從記錄組中取出的構(gòu)成一個頁的行數(shù);然后通過
RecordCount 屬性來確定記錄的總數(shù);再用記錄總數(shù)除以 PageSize 就可得
到所顯示的頁面總數(shù);最后通過 AbsolutePage 屬性就能完成對指定頁的訪問
好象很并不復(fù)雜呀,下面讓我們來看看程序該如何實現(xiàn)呢?
我們建立這樣一個簡單的 BBS 應(yīng)用程序,它的數(shù)據(jù)庫中分別有以下五個
字段:“ID”,每個帖子的自動編號;“subject”,每個帖子的主題;
“name”,加帖用戶的姓名;“email”,用戶的電子郵件地址;
“postdate”,加帖的時間。數(shù)據(jù)庫的 DSN 為“bbs”。我們將顯示帖子
分頁的所有步驟放在一個名為“ShowList()”的過程中,方便調(diào)用。
程序如下:
'----BBS 顯示帖子分頁----
< % Sub ShowList() %>
< %
PgSz=20 '設(shè)定開關(guān),指定每一頁所顯示的帖子數(shù)目,默認為20帖一頁
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
sql = "SELECT * FROM message order by ID DESC"
'查詢所有帖子,并按帖子的ID倒序排列
Conn.Open "bbs"
RS.open sql,Conn,1,1
If RS.RecordCount=0 then
response.write "< P>< center>對不起,數(shù)據(jù)庫中沒有相關(guān)信息!
< /center>< /P>"
else
RS.PageSize = Cint(PgSz) '設(shè)定PageSize屬性的值
Total=INT(RS.recordcount / PgSz * -1)*-1 '計算可顯示頁面的總數(shù)
PageNo=Request("pageno")
if PageNo="" Then
PageNo = 1
else
PageNo=PageNo+1
PageNo=PageNo-1
end if
ScrollAction = Request("ScrollAction")
if ScrollAction = " 上一頁 " Then
PageNo=PageNo-1
end if
if ScrollAction = " 下一頁 " Then
PageNo=PageNo+1
end if
if PageNo < 1 Then
PageNo = 1
end if
n=1
RS.AbsolutePage = PageNo
Response.Write "< CENTER>"
position=RS.PageSize*PageNo
pagebegin=position-RS.PageSize+1
if position < RS.RecordCount then
pagend=position
else
pagend= RS.RecordCount
end if
Response.Write "< P>< font color='Navy'>< B>數(shù)據(jù)庫查詢結(jié)果:< /B>"
Response.Write "(共有"&RS.RecordCount &"條符合條件的信息,
顯示"&pagebegin&"-"&pagend&")< /font>< /p>"
Response.Write "< TABLE WIDTH=600 BORDER=1 CELLPADDING=4
CELLSPACING=0 BGCOLOR=#FFFFFF>"
Response.Write "< TR BGCOLOR=#5FB5E2>< FONT SIZE=2>< TD>
< B>主題< /B>< /TD>< TD>< B>用戶< /B>< /TD>< TD>< B>Email< /B>
< /TD>< TD>< B>發(fā)布日期< /B>< /TD>< /FONT>< TR BGCOLOR=#FFFFFF>"
Do while not (RS is nothing)
RowCount = RS.PageSize
Do While Not RS.EOF and rowcount > 0
If n=1 then
Response.Write "< TR BGCOLOR=#FFFFFF>"
ELSE
Response.Write "< TR BGCOLOR=#EEEEEE>"
End If
n=1-n %>
< TD>< span style="font-size:9pt">
< A href='view.asp?key=< % =RS("ID")%>'>< % =RS("subject")%>
< /A>< /span>< /td>
< TD>< span style="font-size:9pt">
< % =RS("name")%>< /A>< /span>< /td>
< TD>< span style="font-size:9pt">
< a href="mailto:< % =RS("email")%>">< % =RS("email")%>< /a>
< /span> < /TD>
< TD>< span style="font-size:9pt">
< % =RS("postdate")%>< /span> < /td>
< /TR>
< %
RowCount = RowCount - 1
RS.MoveNext
Loop
set RS = RS.NextRecordSet
Loop
Conn.Close
set rs = nothing
set Conn = nothing
%>
< /TABLE>
< FORM METHOD=GET ACTION="list.asp">
< INPUT TYPE="HIDDEN" NAME="pageno" value="< % =PageNo %>">
< %
if PageNo > 1 Then
response.write "< INPUT TYPE=SUBMIT NAME='ScrollAction'
value=' 上一頁 '>"
end if
if RowCount = 0 and PageNo < >Total then
response.write "< INPUT TYPE=SUBMIT NAME='ScrollAction'
value=' 下一頁 '>"
end if
response.write "< /FORM>"
End if
%>
< % End Sub %>
相信大家都應(yīng)該能完全讀懂上面的程序,因此就不在此詳細解釋了。
值得注意的是在這段程序中運用了一個小技巧 < INPUT TYPE="HIDDEN"
NAME="pageno" value="< % =PageNo %>">,這是用來在每次調(diào)用該
ASP 文件時傳遞數(shù)據(jù)的“暗道”,由于我們需要在每次調(diào)用程序時傳遞代表
當(dāng)前頁碼的參數(shù),可能大家會想到使用 session,但是從節(jié)省系統(tǒng)資源和
通用性來講,用這樣一個隱藏的 form 來傳遞數(shù)據(jù)將會達到更好的效果。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -