通過 ASP 記錄進行分頁

來源:互聯網
上載者:User
分頁 通過 ASP 記錄進行分頁
J.D. Meier
目錄

--------------------------------------------------------------------------------
1、簡介
2、問題
3、解決方案
4、範例程式碼
5、分析
6、結論

--------------------------------------------------------------------------------

簡介

在 Active Server Pages (ASP) 應用程式中顯示大型記錄集,很可能是您熟悉的一個問題。本文對此問題及其解決方案和範例程式碼進行了深入探討,這個範例程式碼經過簡單修改,就可以應用於您的具體情況。該範例程式碼被設計成伺服器端的解決方案,它與瀏覽器無關。另外,我會指出您在設計自己的解決方案時需要考慮的問題。

問題

您的查詢返回了一個大型記錄集。需要提供一個簡便方法來瀏覽這些結果,即在每頁上只顯示結果的子集。要有效完成此項工作,需要對 ActiveX(R) 資料對象 (ADO) 和資料庫如何協同工作有深入的瞭解。

解決方案

如何將您的記錄集分成“頁”,而不用大型的結果?所謂頁,基本上就是您指定應當顯示在一起的許多記錄。例如,如果您的記錄集中有 100 條記錄,可能每頁顯示 10 條記錄。

ADO 提供了兩種方法,PageSize 和 AbsolutePage。這些方法使您能夠指定每頁要顯示的記錄數,以及將遊標定位於一頁的開始。

開啟記錄集之後,基本步驟就是:

為該記錄集指定 PageSize。它表示每頁要顯示的記錄數。
指定該記錄集的 AbsolutePage。這將記錄指標移到頁的序列中,給定頁的開始處。
顯示記錄頁。要完成這一步,您要用設定的 PageSize 次數迴圈整個記錄集,或者直到到達檔案的末尾。
範例程式碼

下列範例程式碼說明了頁面建立過程。藉助它,您可以建立自己的解決方案的原型。在您自己的代碼中,確保要完成下列步驟:

添加錯誤處理。
添加對查詢返回的記錄數的限制。
用條件過濾記錄。(如,建立 WHERE 子句)。
使用預存程序或視圖。
一定要通過更改連接字串和 SQL 陳述式來修改我的範例程式碼,以指向您的資料庫。由於代碼使用 ADO 常數,如 adUserServer,一定要在您的 Global.asa 檔案中引用 ADO TypeLibrary,或在 ASP 頁中包括 ADOVBS.INC 檔案。請注意,在將項目引用設定為 Microsoft ADO 時,Visual InterDev(R) 會為您自動產生 TypeLibrary 引用。

注意該樣本有兩種方法可以提供導覽列:

ShowNavBar。 它為使用者提供了帶著記錄計數一起跳到指定頁的方法(見圖 1)。為實現這一步,它使用了 RecordCount 和 PageCount 屬性。
ShowNavBarFast。 該方法不提供跳轉到指定頁的能力,也不提供記錄計數,但可以通過 CacheSize 屬性控製取回的記錄數(見圖 2)。
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 檢視中檢索所有列。
'要最佳化效能:
'- 使用預存程序、視圖或在 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,所以它重試的記錄數僅等於
'記錄集的 CacheSize 指定的數量。

'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

'當記錄集開啟時,adUseClient 的 CursorLocation
' 將檢索所有的記錄。
'adUseServer 允許沿用 CacheSize
rst.CursorLocation = adUseServer

'在使用伺服器端遊標時,CacheSize
'限制了取回的行數。我們將只抓取正在顯示的
'的記錄的數目 - 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>"

'建立表的欄位標題
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

iLoop = 1

rst.PageSize = iRowsPerPage
rst.AbsolutePage = iPageNum

'寫出記錄的當前頁
Do While (Not rst.EOF) and (iLoop <= iRowsPerPage)
Response.Write "<TR>"
For Each fld in rst.Fields
Response.Write "<TD>" & fld.value & "</TD>"
Next
iLoop = iLoop + 1
rst.MoveNext
Response.Write "</TR>"
Loop
Response.Write "</TABLE>"
End Sub

Sub ShowNavBar(rst)
Dim iPageCount
Dim iLoop
Dim sScriptName

'本版本提供了更豐富的使用者導航,但是
'依賴於 RecordCount 和 PageCount,
'它抵消了為伺服器端遊標
'指定 CacheSize 的好處。

Response.Write "<BR><BR>"
sScriptName = Request.ServerVariables("SCRIPT_NAME")

If iPageNum > 1 Then
Response.Write " <a href=" & sScriptName & "?iPageNum="
Response.Write (iPageNum -1) & "><< Previous</a>"
End If

iPageCount = rst.PageCount
Do Until iLoop > iPageCount
f iLoop = iPageNum Then
Response.Write " <B>" & CStr(iLoop) & "</B>"
Else
Response.Write " <a href=" & sScriptName & "?iPageNum=" & _
Cstr(iLoop) & ">" & iLoop & "</a>"
End If
iLoop = iLoop + 1
Loop

If Not rst.EOF Then
Response.Write " <a href=" & sScriptName & "?iPageNum="
Response.Write (iPageNum +1) & "> Next >></a><BR>"
Else
Response.Write "<BR>"
End If

Response.Write "Page " & iPageNum & " of " & iPageCount & "<BR>"
Response.Write rst.RecordCount & " Records" 牋?
End Sub

Sub ShowFastNavBar(rst)
Dim iPageCount
Dim iLoop
Dim sScriptName

'在指定 CacheSize 和使用伺服器端遊標時,
'該方法特別有效,因為它不使用 RecordCount
'和 PageCount。需要使用者具有經驗。

Response.Write "<BR><BR>"
sScriptName = Request.ServerVariables("SCRIPT_NAME")

If iPageNum > 1 Then
Response.Write " <a href=" & sScriptName & "?iPageNum="
Response.Write (iPageNum -1) & "><< Previous</a>"
End If

If Not rst.EOF Then
Response.Write " <a href=" & sScriptName & "?iPageNum="
Response.Write (iPageNum +1) & "> Next >></a><BR>"
Else
Response.Write "<BR>"
End If

Response.Write "Page " & iPageNum

End Sub

Sub CleanUp(rst)
If Not rst Is Nothing then
If rst.state = adStateOpen then rst.close
set rst = nothing
End If
End Sub

</SCRIPT>
分析

設計分頁解決方案時,需注意的幾個問題:

遊標定位問題。如果使用用戶端資料指標,每次開啟記錄集時,將讀取所有的記錄。因此,由於讀取了所有的記錄,以後訪問 RecordCount 或 PageCount 屬性時將很快。如果您使用伺服器端遊標,將只檢索需要的記錄。您可以通過 CacheSize 屬性指定一次要讀取的記錄數來提高效能。然而,如果您使用伺服器端遊標,和 RecordCount 或 PageCount 屬性,則將讀取所有的記錄,效能得不到提高。必須在具有更多資訊和更豐富導航的使用者介面,與檢索所有記錄的效能影響之間折衷。
使用伺服器端遊標時,CursorType 屬性必須是 adOpenStatic 或 adOpenKeyset,才能使用分頁。
分頁並非總是最好的使用者頁面。它可能僅適用於使用者正從搜尋引擎掃描結果或瀏覽產品目錄的情況。
試將記錄分類,以使更相關的記錄出現在前幾頁中(例如,使用 SQL 的 ORDER BY 子句)。使用者所能做的就這麼多。
只檢索需要顯示的列(即,避免 SELECT *)。
只檢索需要顯示的記錄。確保過濾的條件(即,使用 WHERE 子句)。
以下是需要牢記的幾點提示:

將您的邏輯封裝在方法中。使用方法可將表示邏輯和資料訪問邏輯分離,這就簡化了將代碼裝入 Windows 指令碼組件、Visual Basic 指令碼編輯 (VBScript) 類或組件的工作。改變功能更容易了,代碼維護也得以改進。測試和調試也因可以注釋和取消注釋方法調用而得到改進。
與包括 ADOVBS.INC 相比,引用 ADO 的 TypeLibrary 是更好的解決方案。這是因為 ASP 在處理包含檔案時,是將整個檔案讀入記憶體,而不是唯讀入它需要的部分。
結論

分頁是一項通用技術,許多 Web 應用程式用它來提供瀏覽大量記錄的好方法。在設計分頁解決方案時,需要考慮一些問題,如,如何檢索記錄,需要提供什麼類型的使用者導航。儘管最好的解決方案取決於您的具體的應用程式,使用本文中的技術將協助您作出更好的設計決策




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.