前言
大量資料分頁顯示是 Web 開發核心需求。ASP 時代利用 ADO `Recordset` 內建分頁屬性 (`PageSize`、`PageCount`、`AbsolutePage`),可實作多種分頁策略。本文系統整理七大類方法,並深度解析 `Recordset` 分頁屬性運作原理。
Recordset 分頁核心屬性
| 屬性/方法 | 說明 | 關鍵備註 |
PageSize | 每頁記錄數 | 設定後自動計算 PageCount |
PageCount | 總頁數 (唯讀) | 依 PageSize 與 RecordCount 計算 |
AbsolutePage | 當前頁碼 (1-based,可讀寫) | 設定即跳轉至該頁首筆 |
AbsolutePosition | 當前記錄在 Recordset 中的序號 (1-based) | 受 Filter 影響 |
RecordCount | 總記錄數 | 需支援書籤的游標 (Keyset/Static) |
Move | 相對移動記錄指標 | Move 0 可刷新當前記錄 |
BOF/EOF | 檢測首/尾記錄 | 分頁邊界判斷依據 |
七大分頁實現分類
第一類:純 ASP + QueryString 參數傳遞 (最基礎、最通用)
- 方法 1:參數直接代入法 — `List.asp?Page=3`,`AbsolutePage = CLng(Request("Page"))`。
- 方法 2:Session 記錄當前頁 — 頁碼存 Session,連結不帶參數,返回時恢復。適合多條件篩選頁面。
核心代碼 (方法 1):
<%
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("db.mdb")
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM Products", conn, 1, 1 ' adOpenKeyset, adLockReadOnly
rs.PageSize = 10
Dim curPage : curPage = CLng(Request.QueryString("Page"))
If curPage < 1 Then curPage = 1
If curPage > rs.PageCount Then curPage = rs.PageCount
rs.AbsolutePage = curPage
' 輸出導航
If curPage > 1 Then
Response.Write "首頁 "
Response.Write "上一頁 "
End If
Response.Write " 第 " & curPage & " / " & rs.PageCount & " 頁 "
If curPage < rs.PageCount Then
Response.Write "下一頁 "
Response.Write "末頁"
End If
' 輸出當頁資料 (最多 PageSize 筆)
Dim i : i = 0
Do While Not rs.EOF And i < rs.PageSize
Response.Write rs("Name") & "
"
rs.MoveNext
i = i + 1
Loop
%>
第二類:SOM (Script Object Model) + DHTML 資料繫結 (IE 專用、客戶端分頁)
- 方法 3:資料島 + 客戶端游標 — `` 嵌入 XML 資料,`
` 繫結,JS 控制 `recordset.moveNext()`/`movePrevious()`。
- 方法 4:RDS (Remote Data Service) — `RDS.DataControl` 客戶端元件,`Execute` 取得 Recordset,客戶端分頁無需回傳伺服器。
⚠️ **限制**:需 IE 4.0+、ActiveX 啟用、內網環境。現代瀏覽器不支援,已淘汰。
第三類:SOM 設計時期控件 (DTC) 服務端分頁
- 方法 5:DTC Grid + Recordset + PageObject — Visual InterDev 設計拖曳生成,`Grid` 控件自動渲染分頁導航,`PageObject` 管理頁碼狀態。
⚠️ **缺點**:生成代碼冗長、難維護、瀏覽器相容性差、微軟已停止維護 DTC。
第四類:DEOM (Data Environment Object Model) 程式化分頁
- 方法 6:DataEnvironment.Command + Recordset — 在 Data Environment 設計器定義 Command,執行時程式化設定 `PageSize`/`AbsolutePage`,再繫結 Grid 或手工輸出。
- 方法 7:純代碼控制 DEOM Recordset — 不使用設計器,純代碼建立 `DataEnvironment`、執行 Command、操作 Recordset 分頁。
優點:邏輯集中、無設計器耦合、支援程式化動態 SQL。缺點:學習曲線陡峭、文檔稀缺。
現代視角下的最佳實踐建議
- 棄用 Access/Jet:改用 SQL Server / MySQL / PostgreSQL,支援 `OFFSET/FETCH` 或 `ROW_NUMBER()` 高效分頁。
- 資料庫層面分頁:
SQL Server 2012+:`SELECT * FROM T ORDER BY Id OFFSET @offset ROWS FETCH NEXT @pageSize ROWS ONLY`
MySQL/PostgreSQL:`LIMIT @pageSize OFFSET @offset`
- 前端分頁元件化:jQuery DataTables / Bootstrap Pagination / Vue/React 分頁組件,AJAX 取得 JSON 資料。
- 快取首頁/熱門頁:第一頁、熱門分類頁靜態化或 OutputCache,極大降低 DB 壓力。
- 游標分頁 (Keyset Pagination):大資料量翻深頁時,用 `WHERE Id > @lastId ORDER BY Id LIMIT @size` 替代 OFFSET,避免深分頁效能崩塌。
結語
ASP 時代的七種分頁法,本質上都是圍繞 `Recordset.AbsolutePage`/`PageSize` 展開。理解其屬性機制,有助於理解現代 ORM (EF Core `Skip/Take`、Dapper `OFFSET/FETCH`) 的底層邏輯。新專案請直接採用資料庫原生分頁 + 前端元件,避免在應用層搬運大量資料。
copyright ©
萬盛學電腦網 all rights reserved