MS Visual InterDev6.0中七種實現分頁顯示的方法 我們在編制與數據庫有關的Web網頁時,由於要顯示的數據量巨大,常常面臨一個數據記錄分頁顯示的問題。
--------------------------------------------------------------------------------
進行 ADO 存取數據庫時的分頁顯示,其實就是對 Recordset 的記錄進行操作。所以我們首先必須了解 Reordset 對象的屬性和方法:
BOF 屬性:目前指標指到 RecordSet 的第一筆。
EOF 屬性:目前指標指到 RecordSet 的最後一筆。
Move 方法:移動指標到 RecordSet 中的某一條記錄。
AbsolutePage 屬性:設定當前記錄的位置是位於哪一頁
AbsolutePosition 屬性:目前指標在 RecordSet 中的位置。
PageCount 屬性:顯示 Recordset 對象包括多少"頁"的數據。
PageSize 屬性:顯示 Recordset 對象每一頁顯示的記錄數。
RecordCount 屬性:顯示 Recordset 對象記錄的總數。
--------------------------------------------------------------------------------
在微軟的ASP編程體系中,ADO對象的建立,使得從網頁訪問數據庫成為一件易事,特別是ADO的Recordset對象使得控制數據的輸出顯示更為方便、自由。而在Visual InterDev6.0(以下簡稱VI6.0)中,由於Script Object Model(以下簡稱SOM)、Design-Time Control(以下簡稱DTC)以及Data Environment Object Model(以下簡稱DEOM)等對象模型的引入,使網頁對數據庫的訪問設計顯得更為方便。
因為主題方面的原因,關於數據庫的連接,下文只給出代碼和簡要注釋,而把重點放在如何利用Recordset對象(或控件)實現數據記錄的分頁顯示方面。根據我的理解,分頁顯示的關鍵就在於對ADO的Recordset對象或DTC(設計時控件)的Recordset控件的屬性和方法的熟練把握上。
這七種分頁顯示的方法概括起來說分四類:
第一、二種我暫取名叫"純ASP法",這也是國內的ASP網站上用得最多的方法,它們的區別僅在實現技巧的不同。這兩種方法的實現最易理解,用到的對象概念也最少,對開發環境的要求也最低(只要記事本就行)。可以說,這兩種方法的實質還是CGI的編程思想,只是在程序中引入了ADO對象而已。
第四、五種暫取名叫"SOM的DHTML法"。這兩種方法要求在VI6.0的環境下,利用微軟提出的腳本對象模型(Script Object Model)和DHTML中Table對象的與數據庫綁定的新特性(許多書和文章只介紹了DHTML的CSS特性在樣式設計中的運用而忽略介紹其數據綁定特性),實現在客戶端控制翻頁。但它要求用戶的浏覽器必須是支持DHTML,如:Microsoft Internet Explorer 4.0及以上的版本。
第六種暫取名叫"SOM服務器端法"。要求在VI6.0的環境下開發,它利用微軟提出的腳本對象模型(Script Object Model)中的幾個DTC控件:Recordset、PageObject、Grid等在服務器端(客戶端)實現翻頁控制。這是一種激動人心的、全新的編程方法,它把網頁看成對象(這種對象模型和傳統的DOM----document object model是有區別的:DOM只能控制客戶端,而SOM可控制服務器端和客戶端),它真正實現了網頁的面向對象編程。但遺憾的是,也許是我個人能力有限,這種技術我個人認為還不是很成熟,比如,與浏覽器的結合還不是很好,這將在後文詳細說明。
第七種暫取名叫"DEOM法"。它也是利用了VI6.0中建立的數據環境對象模型(Data Environment Object Model)建立Recordset對象。這也是在網頁編程上比較少見的新方法,與SOM模型相比,自有它的優點,這將在後文詳述。
在後面所舉的所有例子源代碼,都可以直接拷貝使用,你甚至可以不懂其原理,只要把其中的粗斜體字部分換成相應自己的數據庫名或字段名就可以了。
在開始詳細介紹各種分頁方法前,讓我們先創建一個數據庫:用Office97中的access自創一個Employee.mdb,其中建一個表emp,只設三個字段:emp ID,last name和first name。為什麼這麼簡單,是因為我們關心的是怎樣處理recordset的結果。
第一種:參數直接代入法。
這種方法是用手工建立Recordset對象,利用其pagesize(每頁指定顯示記錄數),pagecount(總頁碼數)和absolutepage(當前頁碼數)屬性來控制分頁的輸出。分頁采用<href>直接帶頁碼參數的方法來控制翻頁。網頁的名字為emp1.asp。源代碼如下:
<%//建立與employee.mdb數據庫的連接。
Set conn = Server.createObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=employee.mdb"
//建立emp表的Recordset對象實例rs。
Set rs = Server.createObject("ADODB.Recordset")
rs.Open "emp", conn, 3
PageSize = 10 //pagesize屬性指定了每頁要顯示的記錄條數
Page = CLng(Request("Page")) string型轉化為long型
If Page < 1 Then Page = 1
If Page > rs.PageCount Then Page = rs.PageCount
If Page <> 1 Then
Response.Write "<A HREF=emp1.asp?Page=1>第一頁</A>"
Response.Write "<A HREF=emp1.asp?Page=" & (Page-1) & ">上一頁</A>"
End If
If Page <> rs.PageCount Then
Response.Write "<A HREF=emp1.asp?Page=" & (Page+1) & ">下一頁</A>"
Response.Write "<A HREF=emp1.asp?Page="&rs.PageCount & ">最後一頁</A>"
End If
Response.write"頁碼:" & Page & "/" & rs.PageCount & "</font>"
//每一頁的顯示
//顯示表頭
Response.Write "<CENTER><TABLE BORDER=1>"
Response.WRITE "<TR><TD>" & rs.Fields("emp ID").Name & "</TD>"