在微软的ASP编程体系中ADO对象的建立使得从网页访问数据库成为一件易事特别是ADO的Recordset对象使得控制数据的输出显示更为方便自由而在Visual InterDev(以下简称VI)中由于Script Object Model(以下简称SOM)DesignTime Control(以下简称DTC)以及Data Environment Object Model(以下简称DEOM)等对象模型的引入使网页对数据库的访问设计显得更为方便
因为主题方面的原因关于数据库的连接下文只给出代码和简要注释而把重点放在如何利用Recordset对象(或控件)实现数据记录的分页显示方面根据我的理解分页显示的关键就在于对ADO的Recordset对象或DTC(设计时控件)的Recordset控件的属性和方法的熟练把握上
这七种分页显示的武器概括起来说分四类
第一二种我暂取名叫“纯ASP法”这也是国内的ASP网站上用得最多的方法它们的区别仅在实现技巧的不同这两种方法的实现最易理解用到的对象概念也最少对开发环境的要求也最低(只要记事本就行)可以说这两种方法的实质还是CGI的编程思想只是在程序中引入了ADO对象而已
第四五种暂取名叫“SOM的DHTML法”这两种方法要求在VI的环境下利用微软提出的脚本对象模型(Script Object Model)和DHTML中Table对象的与数据库绑定的新特性(许多书和文章只介绍了DHTML的CSS特性在样式设计中的运用而忽略介绍其数据绑定特性)实现在客户端控制翻页但它要求用户的浏览器必须是支持DHTML如Microsoft Internet Explorer 及以上的版本
第六种暂取名叫“SOM服务器端法”要求在VI的环境下开发它利用微软提出的脚本对象模型(Script Object Model)中的几个DTC控件RecordsetPageObjectGrid等在服务器端(客户端)实现翻页控制这是一种激动人心的全新的编程方法它把网页看成对象(这种对象模型和传统的DOMdocument object model是有区别的DOM只能控制客户端而SOM可控制服务器端和客户端)它真正实现了网页的面向对象编程但遗憾的是也许是我个人能力有限这种技术我个人认为还不是很成熟比如与浏览器的结合还不是很好这将在后文详细说明
第七种暂取名叫“DEOM法”它也是利用了VI中建立的数据环境对象模型(Data Environment Object Model)建立Recordset对象这也是在网页编程上比较少见的新方法与SOM模型相比自有它的优点这将在后文详述
在后面所举的所有例子源代码都可以直接拷贝使用你甚至可以不懂其原理只要把其中的粗斜体字部分换成相应自己的数据库名或字段名就可以了
在开始详细介绍各种分页方法前让我们先创建一个数据库用Office中的access自创一个Employeemdb其中建一个表emp只设三个字段emp IDlast name和first name为什么这么简单是因为我们关心的是怎样处理recordset的结果
第一种参数直接代入法
这种方法是用手工建立Recordset对象利用其pagesize(每页指定显示记录数)pagecount(总页码数)和absolutepage(当前页码数)属性来控制分页的输出分页采用<href>直接带页码参数的方法来控制翻页网页的名字为empasp源代码如下
<%//建立与employeemdb数据库的连接
Set conn = ServerCreateObject("ADODBConnection")
connOpen "driver={Microsoft Access Driver (*mdb)};dbq=employeemdb"
//建立emp表的Recordset对象实例rs
Set rs = ServerCreateObject("ADODBRecordset")
rsOpen "emp" conn
PageSize = //pagesize属性指定了每页要显示的记录条数
Page = CLng(Request("Page")) ’string型转化为long型
If Page < Then Page =
If Page > rsPageCount Then Page = rsPageCount
If Page <> Then
ResponseWrite "<A HREF=empasp?Page=>第一页</A>"
ResponseWrite "<A HREF=empasp?Page=" & (Page) & ">上一页</A>"
End If
If Page <> rsPageCount Then
ResponseWrite "<A HREF=empasp?Page=" & (Page+) & ">下一页</A>"
ResponseWrite "<A HREF=empasp?Page="&rsPageCount & ">最后一页</A>"
End If
Responsewrite"页码" & Page & "/" & rsPageCount & "</font>"
//每一页的显示
//显示表头
ResponseWrite "<CENTER><TABLE BORDER=>"
ResponseWRITE "<TR><TD>" & rsFields("emp ID")Name & "</TD>"
ResponseWRITE "<TD>" & rsFields("last name")Name & "</TD>"
ResponseWRITE "<TD>" & rsFields("first name")Name & "</TD></TR>"
//循环显示每条记录
rsAbsolutePage = Page //把页码赋给absolutepage属性从而知当前页的首条记录号
For iPage = To rsPageSize //
ResponseWRITE "<TR><TD>" & rsFields("emp ID")Value & "</TD>"
ResponseWRITE "<TD>" & rsFields("first name")Value & "</TD>"
ResponseWRITE "<TD>" & rsFields("last name")Value & "</TD></TR>"
rsMoveNext
If rsEOF Then Exit For
Next
ResponseWrite "</TABLE></CENTER>"%>
第二种表单传送参数法
这种方法在创建Recordset对象时与第一种相同只是在翻页控制时采用<input>和case语句配合来实现翻页网页的名字为:empasp此方法在编程逻辑上有个缺点就是在按过“上页”或“下页”钮后再在浏览器上按刷新按钮时会自动翻页源代码如下
if Pagenum = "" Then Pagenum = //从第一页开始显示
//建立数据库连接和Recordset对象实例rs
与第一种方法相同此处略过
RSPagesize = ’ 设置一页中显示的记录条数为条
// 确定翻页的动作
Select Case Request("NAV")
Case ""
session("Pagenum") =
case "First" ’ First Record
session("Pagenum") =
case "Prev" ’ Previous Record
if session("Pagenum") > then
session("Pagenum") = session("Pagenum")
End If
case "Next" ’ Next Record
if session("Pagenum")< RSPageCount then
session("Pagenum") = session("Pagenum") +
End if
case "Last" ’ Last Record
session("Pagenum") = RSPageCount
End Select
RSAbsolutepage = Clng(session("Pagenum")) //确定当前页的第一条记录号
// 显示当前页
同第一种方法此处略过
// Nav 翻页按钮设置
<form method="GET" action="empasp">
<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网页中就行了而且你还能选择是在服务器平台还是在客户端平台控制翻页缺点就是你必须用它给定的格式显示而不能自己自由控制表格的显示格式
方法如下
在VI中建一个工程empvip再在工程中添加一个asp网页empasp
第一步选VI菜单条上的“add data connect…”按开发工具的导航提示你就可以很容易地建立与Employeemdb数据库的连接从DTC工具栏中拖一个Recordset控件到网页中并设置其属性具体如图
当你拖控件到网页中时VI会自动提示你“是否使用Scripting object model”按yes
第三步从DTC工具栏中拖一个Grid控件到网页中然后单击鼠标右键设置其属性如选在第二步中创建的Recordset控件名选择emp表中的字段每页显示多少条记录以及显示格式等非常简单方便只要照着导航提示做就行了
第四种DHTML法一
数据记录显示在一个HTML表中它利用DHTML中表的数据绑定特性来控制记录的分页显示缺点就是你的翻页方法将被限制为一种特定的方式只能“上页”和“下页”而不能“首页”和“末页”由于是在客户端控制翻页所以这种和第五种方法是速度最快的但遗憾的是它只能在支持DHTML的浏览器上使用
在DHTML中<TABLE>的DATASRC属性可使表格绑定到一个数据源另一个属性DATAPAGESIZE可指定一页一次显示的记录数
我们来看下面的例子
第一步拖Recordset控件到新建的网页emphtm中设置其属性方法同第三种此处略
第二步输入下面的代码
<TABLE ID="Table" DATASRC="#Recordset_RDS" DATAPAGESIZE=> //假定前面设定Recordset控件名为Recordset每页显示条记录
<THEAD>
<TH ALIGN="left" WIDTH=>Emp ID</TH> //输出表头
<TH ALIGN="left" WIDTH=>Last Name</TH>
<TH ALIGN="left" WIDTH=>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()
TablepreviousPage()
End Function
Function btnNext_onclick()
TablenextPage()
End Function
</SCRIPT>
第五种DHTML法二
这种方法是对第四种方法的完善采用手工编写脚本的方法使我们能做“首页”“末页”翻页导航按钮并能确定每条记录的位置(记录号)由于篇幅的关系我在下面只介绍一个具体例子并给出简要说明其它关于DHTML和Recordset控件的一些属性和方法请读者自行参照相关书籍这里需要提请注意的是Recordset控件与第一二种方法中介绍的ADO的Recordset对象有些不同Recordset控件没有直接给出pagesize和pagecount等属性需要用下面介绍的方法来计算
第一步拖Recordset控件到新建的网页emphtm中名字为Recordset设置其属性方法同第三种此处略
第二步定义三个全局变量和编写Recordset的ondatasetcomplete(数据设置完成时)脚本
Dim gCurrentPageNumber //当前页号
Dim gMaxPageNumber //最大页数
Dim gRecordsPerPage //每页显示记录数
gRecordsPerPage = // 设置每页显示记录数为条记录
Function Recordset_ondatasetcomplete()
totalRecordCount = RecordsetgetCount() //总的记录条数
gMaxPageNumber = Int(totalRecordCount / gRecordsPerPage) //获得最大页数
If (totalRecordCount Mod gRecordsPerPage) > then
gMaxPageNumber = gMaxPageNumber +
End If
End Function
第三步创建翻页导航按钮
Function btnFirst_onclick() ’ 翻到首页
gCurrentPageNumber =
DisplayData()
End Function
Function btnPrevious_onclick() ’ 翻到上一页
if gCurrentPageNumber > Then
gCurrentPageNumber = gCurrentPageNumber
DisplayData()
End If
End Function
Function btnNext_onclick() ’ 翻到下一页
if gCurrentPageNumber < gMaxPageNumber Then
gCurrentPageNumber = gCurrentPageNumber +
DisplayData()
End If
End Function
Function btnLast_onclick() ’翻到末页
gCurrentPageNumber = gMaxPageNumber
DisplayData()
End Function
第四步编写显示每一页的函数其中使用了许多DHTML的属性和方法请读者自行参考相关书籍
Sub DisplayData()
startRecord = ((gCurrentPageNumber ) * gRecordsPerPage) + //计算每一页开始显示的记录号数(位置第几条)
rowCtr =
lblPageNumberinnerHTML = gCurrentPageNumber & "/" & gMaxPageNumber
For recordPtr = startRecord To (startRecord + gRecordsPerPage ) //循环显示一页的各条记录
If recordPtr > RecordsetgetCount() Then //显示空表
Tablerows(rowCtr)cells()innerHTML = "<P> </P>"
Tablerows(rowCtr)cells()innerHTML = "<P> </P>"
Tablerows(rowCtr)cells()innerHTML = "<P> </P>"
Tablerows(rowCtr)cells()innerHTML = "<P> </P>"
Else //具体显示每一页
RecordsetmoveAbsolute(recordPtr) //移动记录指针
empID = RecordsetfieldsgetValue("emp ID")
empLName = RecordsetfieldsgetValue("first name")
empFName = RecordsetfieldsgetValue("last name")
Tablerows(rowCtr)cells()innerText = recordPtr ’ Counter
Tablerows(rowCtr)cells()innerText = empID
Tablerows(rowCtr)cells()innerText = empLName
Tablerows(rowCtr)cells()innerText = empFName
End If
rowCtr = rowCtr +
Next
End Sub
另外我们还需要在window对象的onload事件中编写如下脚本
For rowCtr = to gRecordsPerPage
TableinsertRow(rowCtr) ’ 插一新列
For cellCtr = to
Tablerows(rowCtr)insertCell()
Next
Next
第六种服务器端控制翻页方法
如果我们在服务器端对数据进行分页形成HTML语句后再输出到客户端就不会存在浏览器不支持DHTML的问题了可是用服务器端法使得我们每次翻页时都得让Recordset控件重新产生一次因此速度肯定要比用DHTML的方法慢但如果服务器足够快的话这点慢客户是察觉不到的
下面的例子中我将介绍一个新的DTC控件PageObject这个控件使被指定的网页成为一个网页对象用户在此网页的服务器脚本中组织的子程序和函数可被看作是该网页对象的方法它提供了管理状态信息的一种先进的方法网页对象有一些属性(变量)用户可以定义这些属性的生存期因为以上这些特性使我们在编制翻页的脚本时非常方便
但这种方法的缺点是当你按了“上页”或“下页”按钮后再浏览器上的按刷新按钮网页会自动翻页另外如果按了浏览器上的“回退”按钮后再按翻页按钮可能会出现一次乱翻这都是因为网页对象属性(全局变量)造成的
第一步拖Recordset控件到新建的网页empasp中名字为Recordset设置其属性方法同第三种此处略
第二步拖PageObject控件到网页中取名叫emplist然后右键单击此控件打开属性页并设置MaxPageNumberRecordsPerPageCurrrentPageNumber三个属性(全局变量)VI可用get和set方法来读写它们的值具体用法请查阅相关资料
第三步编写Recordset的ondatasetcomplete事件
Function Recordset_ondatasetcomplete()
recordsPerPage =
empListsetRecordsPerPage(recordsPerPage)//设置网页对象每页记录条数属性为
totalRecordCount = RecordsetgetCount()//获得记录集的总条数
mpn = Int(totalRecordCount / recordsPerPage) //计算出mpn为总页数
If (totalRecordCount Mod recordsPerPage) > then
mpn = mpn +
End If
empListsetMaxPageNumber(mpn)
End Function
第四步拖四个button控件到网页中编写翻页控制脚本我们主要是通过改变网页对象的CurrentPageNumber属性的值来实现翻页
Function btnFirst_onclick()’ 翻到首页
empListsetCurrentPageNumber()
End Function
Function btnPrevious_onclick()’ 翻到上一页
cpn = empListgetCurrentPageNumber()
if cpn > Then
empListsetCurrentPageNumber(cpn )
End If
End Function
Function btnNext_onclick()’ 翻到下一页
cpn = empListgetCurrentPageNumber()
if cpn < empListgetMaxPageNumber() then
empListsetCurrentPageNumber(cpn + )
End If
End Function
Function btnLast_onclick() ’ 翻到末页
empListsetCurrentPageNumber( empListgetMaxPageNumber() )
End Function
为保证首次进入该页时显示的是第一页我们还得编写该网页对象的onEnter事件
Function empList_onEnter()
If empListfirstEntered Then
empListsetCurrentPageNumber()
End If
End Function
第五步编写显示每一页的脚本
<HR><TABLE BORDER=><TR>//显示表头
<TH ALIGN="left" WIDTH=></TH>
<TH ALIGN="left" WIDTH=>Emp ID</TH>
<TH ALIGN="left" WIDTH=>Last Name</TH>
<TH ALIGN="left" WIDTH=>First Name</TH></TR>
<%
pageNumber = empListgetCurrentPageNumber()//计算翻页所需的各种参数同DHTML法二
recordsPerPage = empListgetRecordsPerPage()
startRecord = ((pageNumber ) * recordsPerPage) +
lastRecord = RecordsetgetCount()
For recordPtr = startRecord To (startRecord + recordsPerPage )%>
<%If RecordsetEOF = True Then%>
<TR>
<TD> </TD>
<TD> </TD>
<TD> </TD>
<TD> </TD>
</TR>
<%Else%>
<%RecordsetmoveAbsolute(recordPtr)%>
<TR>
<% If recordPtr <= lastRecord Then %>
<TD><%=recordptr%></TD>
<%Else%>
<TD> </TD>
<% End If %>
<TD><%=RecordsetfieldsgetValue("emp ID")%></TD>
<TD><%=RecordsetfieldsgetValue("last name")%></TD>
<TD><%=RecordsetfieldsgetValue("first name")%></TD>
</TR>
<%End If%>
<%Next%>
</TABLE><HR>
第七种Data Environment Object Model(数据环境对象模型)法
Data Environment对象模型把ADO对象模型及它的对象“Connection”“Command”“Recordset”“Field”以及“Parameter”对象抽象到一个更加容易的表单中Data Environment Object Model把命令显露为方法用户可以调用这些方法这些方法会执行这些命令并返回所得到的记录集关于DEOM对象模型详细资料请参考相关书籍我们来看下面网页empasp的例子
第一步在VI的“project Explorer”窗口中的工程项目上右击鼠标并从弹出式菜单选择“Add Data Connection”根据VI给出的导航提示建立一个到数据库的连接之后用户就添加了一个实现从ASP应用程序访问数据库的数据命令同时你将会在“Project Explorer”窗口中的globalasa文件下方看到一个“Data Environment”对象
第二步右击“Data Environment”对象然后从弹出式菜单中选择“Add Data Command”选项添加一个数据命令Command根据VI的导航提示你可以在Command Properties弹出窗口的Genetal页中选SQL Statement输入select * from emp按OK返回
第三步你创建了这个数据命令后就已经为该Data Environment对象创建了一个方法然后就可以从脚本中调用这个方法而且该方法将会给用户返回一个记录集
thisPagecreateDE() //在SOM模式下thisPage表示当前网页对象createDE()方法创建了DE对象
DECommand//执行DE对象的命令后面可代参数做有条件查询时很有用
Set rs=DErsCommand//DErscommand使得rs对象完全等同于一个ADO的Recordset对象
第四步因为rs为ADO对象所以以下的实现翻页代码完全参照以上介绍的几种方法此处略过
其它还有如FrontPage的数据库导航中实现的方法等因与本主题无关此处略
综上所述前面介绍的每种方法都包含了很多新的技术由于篇幅的关系无法深入本文只是想通过实现翻页这一具体的例子来介绍ASP网页编程的多种方法让大家亲身体验一下VI在编制网页中的强大功能了解和熟悉微软在网页编程中提出的ADODHTMLDTC控件SOM对象模型和DEOM对象模型的使用方法希望能给大家在编制网页时提供更多的选择和参考