大家都知道,ASP有著強大的資料庫操作能力,這與她能方便的調用ActiveX對象是密不可分的。下面我給大家介紹一種ASP利用ADO對象實現對資料庫記錄分頁顯示的方法。以下代碼均在WIN98+PWS+MSACCESS環境下通過。
在這裡我主要通過ADO對象集中的Recordset對象來實現各種資料庫操作的。先介紹幾個用於分頁顯示的Recordset屬性。
PageSize:每頁顯示的記錄數。
PageCount:根據使用者設好的PageSize和表中的總記錄數,系統自動算出總頁數。
RecordCount:表中的總記錄數。
AbsolutePage:表示當前頁碼。如將AbsolutePage屬性設為3,則目前記錄移至第3頁第1條(也就是第31條)。
看到Recordset有了這幾個屬性後,相信大家也都覺得做一個分頁顯示的程式是很簡單的。下面講一下思路,所有實現這一功能的代碼都放在display.asp中,按執行的順序分別是:開啟資料庫及表、讀取使用者要求的顯示方式、設定好PageSize和AbsolutePage、將內容輸出到瀏覽器、設定好導航條。以下是代碼:
<%'---------------------------開啟資料庫及表
set conn=server.createobject("ADODB.Connection")
filepath=server.mappath("abc.mdb") '-------假設資料庫檔案是"abc.mdb"
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & filepath
set rs=server.createobject("ADODB.Recordset")
rs.open "main",conn,3,2 '-------假設表的名字是"main"
%>
<%'---------------------------讀取使用者要求的顯示方式(通過參數傳遞)
line=cint(request("line"))
page=cint(request("page"))
%>
<%'---------------------------按使用者要求設定好顯示方式
rs.PageSize=line
rs.AbsolutePage=page
%>
<%'---------------------------顯示內容%>
<table width="100%" border="1">
<tr>
<%for i=0 to rs.Fields.Count-1%>
<td><%=rs.Fields(i).name%></td>
<%next%>
</tr><%'-------以上部分顯示表頭,即欄位名%>
<%for i=1 to rs.PageSize%>
<tr>
<%for j=0 to rs.Fields.Count-1%>
<td><%=rs.Fields(j).value%></td>
<%next%>
</tr>
<%rs.movenext%>
<%if rs.eof then exit for%>
<%next%><%'-------以上部分顯示表的內容%>
</table>
<%'---------------------------導航條%>
<table width=100% ><tr>
<td>
<%if page<>1 then%>
<a href=display.asp?page=1&line=<%=line%>>第一頁</a>
<%else%>第一頁<%end if%>
</td>
<td>
<%if page>1 then%>
<a href=display.asp?page=<%=page-1%>&line=<%=line%>>前一頁</a>
<%else%>前一頁<%end if%>
</td>
<td>
<%if page<rs.PageCount then%>
<a href=display.asp?page=<%=page+1%>&line=<%=line%>>下一頁
<%else%>下一頁<%end if%>
</td>
<td>
<%if page<>rs.PageCount then%>
<a href=display.asp?page=<%=rs.PageCount%>&line=<%=line%>>最後一頁</a>
<%else%>最後一頁<%end if%>
</td><%'-------以上四項都需要進行判斷:如果在第一頁就不提供“第一頁”和“前一頁”的連結
'-------如果在最後一頁就不提供“最後一頁”和“後一頁”的連結%>
<td>
<form method="POST" action="display.asp?line=<%=line%>">
請輸入頁碼:<input type="text" name="page" size="3" value="<%=page%>">
</form>
</td>
<td>
<form method="POST" action="display.asp?page=<%=page%>">
請設定每頁<input type="text" name="line" size="3" value="<%=line%>">行
</form>
</td><%'-------因為兩個表單都只有一個表單域,所以沒有提供發送按鈕,直接打斷行符號就行了%>
<td>
第<%=page%>頁/總<%=rs.PageCount%>頁
</td>
</tr></table>
這隻是一個最基本的程式,沒有進行最佳化處理,也還有一些bug,下面我們一起來使它更“完美”一些。
一.關於參數傳遞。假如表中有46條記錄,然後我們在地址欄中敲入http.//localhost/display.asp?line=10&page=2(假設這是正確的路徑)肯定瀏覽器將給我們顯示第二頁的十條記錄。但是如果在地址欄中只敲入http.//localhost/display.asp,瀏覽器卻給我們一個出錯資訊。如何解決呢?我們必須在讀取這些參數時加一個判斷,如果參數是空的,就賦給它一個初值,以防出錯。將“讀取使用者要求的顯示方式”部分用以下代碼代替:
<%
if request("page")<>"" then
page=cint(request("page"))
else
page=1 '-------如果參數page為空白,就給它賦值1
end if
if request("line")<>"" then
line=cint(request("line"))
else
line=10 '-------如果參數line為空白,就給它賦值10
end if
%>
二.參數的合理性問題。如果我們在地址欄中敲入http.//localhost/display.asp?line=20&page=4會出現什麼情況呢?瀏覽器報錯。因為表中只有46條記錄,而我們要它以每頁顯示二十條,第四頁的二十條記錄,也就是第六十一條到第八十條記錄。顯然會出錯。同樣情況還會出現在導航條中,如果當前瀏覽器中顯示的是以每頁十條,第四頁的內容,我們去設定它以每頁二十條顯示,同樣也會出錯。解決方案還是一樣的,先判斷一下參數的合理性,然後再設定顯示方式。將“按使用者要求設定好顯示方式”部分用以下代碼代替。
<%
if page>(rs.RecordCount-1)\line+1 then
'-------通過計算可知,最大頁數=(總記錄數-1)\每頁行數+1
response.write("error!") '-------如果參數不合實際,輸出"error!"
response.end '-------終止程式
end if
rs.PageSize=line
rs.AbsolutePage=page
%>
三.驗證表單域。導航條中的兩個輸入文字框輸入的都必須是整數,否則也會出錯。我們可以利用FrontPage的驗證表單域功能開完成,這裡就不多說了。
四.最佳化。到目前為止,這個程式還有一個缺點。在資料庫的存取過程中,最花時間的要數是資料庫的開啟和Recordset對象的建立,而這個程式每次執行都會開啟資料庫及建立Recordset對象,極大的降低了效率,一旦訪問量增大,這個程式也就是去了價值。解決的辦法是:第一次執行程式時,開啟資料庫及建立Recordset對象,並將這些存在session中,下次執行時直接將session中的值返回就行了。用以下代碼代替“開啟資料庫及表”部分。
<%
if not isobject(session("conn")) then
set conn=server.createobject("ADODB.Connection")
filepath=server.mappath("abc.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & filepath
set rs=server.createobject("ADODB.Recordset")
rs.open "main",conn,3,2
set session("conn")=conn
set session("rs")=rs
else
set conn=session("conn")
set rs=session("rs")
end if
%>