在微軟的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>" Response.WRITE "<TD>" & rs.Fields("last name").Name & "</TD>" Response.WRITE "<TD>" & rs.Fields("first name").Name & "</TD></TR>" //循環顯示每條記錄 rs.AbsolutePage = Page //把頁碼賦給absolutepage屬性從而知當前頁的首條記錄號 For iPage = 1 To rs.PageSize // Response.WRITE "<TR><TD>" & rs.Fields("emp ID").Value & "</TD>" Response.WRITE "<TD>" & rs.Fields("first name").Value & "</TD>" Response.WRITE "<TD>" & rs.Fields("last name").Value & "</TD></TR>" rs.MoveNext If rs.EOF Then Exit For Next Response.Write "</TABLE></CENTER>"%> 第二種:表單傳送參數法
這種方法在創建Recordset對象時與第一種相同,只是在翻頁控制時,采用<input>和case語句配合來實現翻頁。網頁的名字為:emp2.asp。此方法在編程邏輯上有個缺點:就是在按過“上頁”或“下頁”鈕后,再在瀏覽器上按刷新按鈕時,會自動翻頁。源代碼如下:
if Pagenum = "" Then Pagenum = 1 //從第一頁開始顯示 //建立數據庫連接和Recordset對象實例rs。 與第一種方法相同,此處略過。
RS.Pagesize = 10 ’ 設置一頁中顯示的記錄條數為10條 // 確定翻頁的動作 Select Case Request("NAV") Case "" session("Pagenum") = 1 case "First" ’ First Record session("Pagenum") = 1 case "Prev" ’ Previous Record if session("Pagenum") > 1 then session("Pagenum") = session("Pagenum") - 1 End If case "Next" ’ Next Record if session("Pagenum")< RS.PageCount then session("Pagenum") = session("Pagenum") + 1 End if case "Last" ’ Last Record session("Pagenum") = RS.PageCount End Select RS.Absolutepage = Clng(session("Pagenum")) //確定當前頁的第一條記錄號 // 顯示當前頁 同第一種方法,此處略過。 // Nav 翻頁按鈕設置 <form method="GET" action="emp2.asp"> <input type="submit" name="NAV" Value="首頁"> <input type="submit" value="上頁" name="NAV"> <input type="submit" value="下頁" name="NAV"> <input type="submit" value="末頁" name="NAV"></form> 第三種:用Grid控件設計分頁
所有的方法中,這種方法最容易。你只需拖DTC中的Recordset控件和Grid控件到asp網頁中就行了。而且,你還能選擇是在服務器平臺還是在客戶端平臺控制翻頁。缺點就是你必須用它給定的格式顯示,而不能自己自由控制表格的顯示格式。
方法如下:
在VI6.0中建一個工程emp.vip。再在工程中添加一個asp網頁:emp3.asp。
第一步:選VI6.0菜單條上的“add data connect…”,按開發工具的導航提示,你就可以很容易地建立與Employee.mdb數據庫的連接。從DTC工具欄中拖一個Recordset控件到網頁中,并設置其屬性。具體如圖:
當你拖控件到網頁中時,VI6.0會自動提示你“是否使用Scripting object model”,按yes。
第三步:從DTC工具欄中拖一個Grid控件到網頁中,然后單擊鼠標右鍵,設置其屬性,如:選在第二步中創建的Recordset控件名,選擇emp表中的字段,每頁顯示多少條記錄以及顯示格式等。非常簡單方便,只要照著導航提示做就行了。
第四種:DHTML法一。
數據記錄顯示在一個HTML表中。它利用DHTML中表的數據綁定特性來控制記錄的分頁顯示。缺點就是你的翻頁方法將被限制為一種特定的方式:只能“上頁”和“下頁”而不能“首頁”和“末頁”。由于是在客戶端控制翻頁,所以,這種和第五種方法是速度最快的,但遺憾的是它只能在支持DHTML的瀏覽器上使用。
在DHTML中,<TABLE>的DATASRC屬性可使表格綁定到一個數據源,另一個屬性DATAPAGESIZE可指定一頁一次顯示的記錄數。
我們來看下面的例子:
第一步:拖Recordset控件到新建的網頁emp4.htm中,設置其屬性,方法同第三種,此處略。
第二步:輸入下面的代碼:
<TABLE ID="Table1" DATASRC="#Recordset1_RDS" DATAPAGESIZE=5> //假定前面設定Recordset控件名為Recordset1。每頁顯示5條記錄。 <THEAD> <TH ALIGN="left" WIDTH=150>Emp ID</TH> //輸出表頭 <TH ALIGN="left" WIDTH=200>Last Name</TH> <TH ALIGN="left" WIDTH=200>First Name</TH> </THEAD> <TR> <TD><DIV DATAFLD="Emp ID"></DIV></TD> //輸出表內容 <TD><DIV DATAFLD="Last Name"></DIV></TD> <TD><DIV DATAFLD="First Name"></DIV></TD> </TR> </TABLE> 第三步:然后,增加一對DTCs Button按鈕控件來做翻頁導航,一個命名為“btnPrevious”(上一頁),一個命名為“btnNext”(下一頁)。它們相應的腳本如下:
<SCRIPT LANGUAGE=VBScript> Function btnPrevious_onclick() Table1.previousPage() End Function
Function btnNext_onclick() Table1.nextPage() End Function </SCRIPT> [1] [2] 下一頁
|