通過(guò)ASP記錄進(jìn)行分頁(yè)的完美解決方案
這篇文章將給大家分享介紹到通過(guò)ASP記錄進(jìn)行分頁(yè)的完美解決方案,希望能給大家?guī)?lái)幫助或啟發(fā)。
簡(jiǎn)介
在 Active Server Pages (ASP) 應(yīng)用程序中顯示大型記錄集,很可能是您熟悉的一個(gè)問(wèn)題。本文對(duì)此問(wèn)題及其解決方案和示例代碼進(jìn)行了深入探討,這個(gè)示例代碼經(jīng)過(guò)簡(jiǎn)單修改,就可以應(yīng)用于您的具體情況。該示例代碼被設(shè)計(jì)成服務(wù)器端的解決方案,它與瀏覽器無(wú)關(guān)。另外,我會(huì)指出您在設(shè)計(jì)自己的解決方案時(shí)需要考慮的問(wèn)題。
問(wèn)題
您的查詢返回了一個(gè)大型記錄集。需要提供一個(gè)簡(jiǎn)便方法來(lái)瀏覽這些結(jié)果,即在每頁(yè)上只顯示結(jié)果的子集。要有效的完成此項(xiàng)工作,需要對(duì) ActiveX(R) 數(shù)據(jù)對(duì)象 (ADO) 和數(shù)據(jù)庫(kù)如何協(xié)同工作有深入的了解。
解決方案
如何將您的記錄集分成“頁(yè)”,而不用大型的結(jié)果?所謂頁(yè),基本上就是您指定應(yīng)當(dāng)顯示在一起的許多記錄。例如,如果您的記錄集中有 100 條記錄,可能每頁(yè)顯示 10 條記錄。
ADO 提供了兩種方法,PageSize 和 AbsolutePage。這些方法使您能夠指定每頁(yè)要顯示的記錄數(shù),以及將游標(biāo)定位于一頁(yè)的開(kāi)始。
打開(kāi)記錄集之后,基本步驟就是:
為該記錄集指定 PageSize。它表示每頁(yè)要顯示的記錄數(shù)。
指定該記錄集的 AbsolutePage。這將記錄指針移到頁(yè)的序列中,給定頁(yè)的開(kāi)始處。
顯示記錄頁(yè)。要完成這一步,您要用設(shè)置的 PageSize 次數(shù)循環(huán)整個(gè)記錄集,或者直到到達(dá)文件的末尾。
示例代碼
下列示例代碼說(shuō)明了頁(yè)面建立過(guò)程。借助它,您可以建立自己的解決方案的原型。在您自己的代碼中,確保要完成下列步驟:
添加錯(cuò)誤處理。
添加對(duì)查詢返回的記錄數(shù)的限制。
用條件過(guò)濾記錄。(如,建立 WHERE 子句)。
使用存儲(chǔ)過(guò)程或視圖。
一定要通過(guò)更改連接字符串和 SQL 語(yǔ)句來(lái)修改我的示例代碼,以指向您的數(shù)據(jù)庫(kù)。由于代碼使用 ADO 常數(shù),如 adUserServer,一定要在您的 Global.asa 文件中引用 ADO TypeLibrary,或在 ASP 頁(yè)中包括 ADOVBS.INC 文件。請(qǐng)注意,在將項(xiàng)目引用設(shè)置為 Microsoft ADO 時(shí),Visual InterDev(R) 會(huì)為您自動(dòng)生成 TypeLibrary 引用。
注意該示例有兩種方法可以提供導(dǎo)航欄:
ShowNavBar。 它為用戶提供了帶著記錄計(jì)數(shù)一起跳到指定頁(yè)的方法。為實(shí)現(xiàn)這一步,它使用了 RecordCount 和 PageCount 屬性。
ShowNavBarFast。 該方法不提供跳轉(zhuǎn)到指定頁(yè)的能力,也不提供記錄計(jì)數(shù),但可以通過(guò) CacheSize 屬性控制取回的記錄數(shù)。
PageThroughRs.Asp
<%@ Language=VBScript %>
<% Option Explicit %>
<SCRIPT LANGUAGE=VBScript RUNAT=SERVER>
'確保引用 ADO Typelib 或使用 ADOVBS.Inc
Dim iPageNum, iRowsPerPage
Main
Sub Main()
Dim rst
Dim sSQL, sConnString
If Request.QueryString("iPageNum") = "" Then
iPageNum = 1
Else
iPageNum = Request.QueryString("iPageNum")
iPageNum = CInt(iPageNum)
End If
iRowsPerPage = 10
sConnString = "Provider=SQLOLEDB.1;password=Xyz123;user id=WebUser;" & _
"Initial Catalog=NorthWind;Data Source=MySQLServer;" & _
"network=dbmssocn;"
'下列 SQL 從 SQL 視圖中檢索所有列。
'要優(yōu)化性能:
'- 使用存儲(chǔ)過(guò)程、視圖或在 SELECT 中指定列
'- 使用限制返回的記錄的條件(例如,WHERE 子句)
sSQL = "SELECT CategoryName, ProductName, QuantityPerUnit,"
sSQL = sSQL & "UnitsInStock, Discontinued"
sSQL = sSQL & " FROM [Products By Category]"
Set rst = GetRecords(sConnString, sSQL)
WriteTableHeader rst
WriteTableBody rst, iRowsPerPage, iPageNum
ShowNavBar rst
'ShowFastNavBar 方法不使用 RecordCount
'或 PageCount,所以它重試的記錄數(shù)僅等于
'記錄集的 CacheSize 指定的數(shù)量。
'ShowFastNavBar rst
CleanUp rst
End Sub
Function GetRecords(sConnString, sSQL)
Dim cnn
Dim rst
set cnn = Server.CreateObject("ADODB.CONNECTION")
cnn.ConnectionString = sConnString
nn.Open
Set rst = Server.CreateObject("ADODB.RECORDSET")
Set rst.ActiveConnection = cnn
'當(dāng)記錄集打開(kāi)時(shí),adUseClient 的 CursorLocation
' 將檢索所有的記錄。
'adUseServer 允許沿用 CacheSize
rst.CursorLocation = adUseServer
'在使用服務(wù)器端游標(biāo)時(shí),CacheSize
'限制了取回的行數(shù)。我們將只抓取正在顯示的
'的記錄的數(shù)目 - iRowsPerPage
rst.CacheSize = iRowsPerPage
rst.Open sSQL,,adOpenStatic, adLockReadOnly牋?
Set GetRecords = rst
end Function
Sub WriteTableHeader(rst)
Dim fld
Response.Write "<TABLE WIDTH=80% BORDER=1>"
Response.Write "<TR>"
'建立表的列標(biāo)題
For Each fld in rst.Fields
Response.Write "<TD><B>" & fld.Name & "</B></TD>"
Next
Response.Write "</TR>"
End Sub
Sub WriteTableBody(rst, iRowsPerPage, iPageNum)
Dim iLoop
Dim fld