不太懂,不过刚好看到一样的文章,就灌一点吧!
WEB数据库分页浏览的技巧
国防大学图书馆技术室 王渤
【提要】本文讲述了ASP开发WEB数据库时,控制网络数据流量,进行分页浏览输出的方法,阐述了分页浏览使用的主要技术和手段,介绍了RECORDSET对象与分页显示有关的技术与基础,文章中以实例介绍了数据记录分页显示的关键技术,并给出了设计思想和具体程序设计。
开发WEB数据库的查询时,为了限制网络流通量,通常会采用SQL(结构化查询语言)查询方式,在其条件子句中使用WHERE条件来筛选输出的记录。但是WHERE子句并不能完全限制用户在网上的查询范围,当查询条件范围较广时,必需要限制输出的数据总量,但上网者只能看到最前面的查询结果。
如果既要控制数据流量,又要让用户浏览所有查询到的数据记录,最普遍最有效的方式是将所查询的全部结果数据进行分页处理,并能提供“上一页”、“下一页”、“第一页”、“最后一页”等功能,或者能够直接定位到某一页,让上网者能逐一浏览每一页的数据记录。
一、 ADO的RECORDSET对象
在作者的《再论ASP开发WEB数据库》一文中,介绍过ADO的各种属性和方法,其中RECORDSET对象是最常用的对象,首先通过以下语句建立RECORDSET对象:
Set conn = Server.CreartObject ("ADODB.connection")
Conn.open "DNS设置"
'以上语句建立ADO联接
Set rs = Server.CreatObject ("ADODB.Recordset")
Rs.open Sql , Conn , adopenStatic
'以上两条语句用于建立RECORDSET对象并打开数据库
通常,我们使用RECORDSET对象的Excute方法打开数据表,如下语句所示:
Set rs = conn.Excute ("SQL语句")
但是使用RECORDSET对象的Excute方法打开数据对象是只能向前滚动的(Forword-Only),当我们读取此类数据记录时,能够调用的只有其MoveNext方法,只能一步步向前移动记录,这种方法不能完成分页显示的功能,因此使用以下方法打开数据记录集:
rs.Open 数据表名或SQL语句,Connection对象,Recordset类型,锁定类型
然后利用RECORDSET对象的“rs.AbsolutePage=n”来设置当前数据记录。
二、 RECORDSET对象的OPEN函数
OPEN函数使用中的参数中,“数据表名或SQL语句”,指具体的要使用的数据表名或者是SQL查询语句,“Connection对象”是一个已经打开的数据库对象,“Recordset类型”有以下四种设置值:
RECORDSET类型设置值
意义
AdOpenForwordOnly (=0)
只读,记录只能向前滚动
AdOpenStatic (=3)
只读,记录可以自由滚动
AdOpenKeyset (=1)
读写,记录可以自由滚动
AdOpenDynamic (=2)
读写,记录可以自由滚动 *
*与上一条区别是该模式可以自动更新当前数据表的数据
“锁定类型”的设置值有以下四种:
锁定类型的设置值
意义
AdLockReadOnly (=1)
打开只读的数据记录
AdLockPressimistic (=2)
悲观锁定
AdLockOptimistic (=3)
乐观锁定
AdLockBatchOptimistic (=4)
批次乐观锁定
为了实现分页显示,在打开RECORDSET对象后,必须先设置PageSize属性(每页的数据记录条数),RECORDSET对象才能计算数据记录的总条数,如下语句设置每页大小为10行:
rs.PageSize = 10
则RECORDSET对象的PageCount属性将设为:
((记录总数-1)/10)+1 (页)
设置rs.PageSize属性后,则可以通过对AbsolutePage属性的设置,将当前数据记录设置到某一页的第一条记录上,如下语句:
rs. AbsolutePage = 3
则当前记录则移动到第3页(每页为10行)的第一条记录上,因此输出某一页数据记录的程序如下:
rs. AbsolutePage = Page 'Page为页码号
For I=1 to rs.PageSize '输出本页的每条记录
'些处输出数据记录
rs.MoveNext '记录移动到下一条
if rs.EOF then exit for '若是记录尾则退出输出,因为若是最后一页,则可以没有足够的数据输出。
Next I
三、 分页显示的技巧实例:显示任一页数据
以下例程用于显示某一页的全部数据:
Sub ShowOnePage( rs, Page )
'rs为打开的数记录集,Page为要显示的页码
Response.Write "<CENTER><TABLE BORDER=1>"
Response.Write "<TR BGCOLOR=#00FFFF>"
Response.WRITE "<TD>序号</TD>"
For i=0 to rs.Fields.Count-1
'输出表头名称
Response.WRITE "<TD>" & rs.Fields(i).Name & "</TD>"
Next
Response.Write "</TR>"
rs.AbsolutePage = Page '设置当前页号
For iPage = 1 To rs.PageSize '输出当前页的所有记录
Response.Write "<TR>"
RecNo = (Page - 1) * rs.PageSize + iPage '计算输出的记录序号
Response.Write "<TD>" & RecNo & "</TD>"
For i=0 to rs.Fields.Count-1 '输出每一字段
Response.WRITE "<TD>" & rs.Fields(i).Value & "</TD>"
Next
Response.Write "</TR>"
rs.MoveNext
If rs.EOF Then Exit For
Next
Response.Write "</TABLE></CENTER>"
End Sub
四、 提供更具浏览性的网页
上网者往往查询多达几十页资料数据,从用户角度考虑,应该提供更直观方便的页面,不妨提供以下功能以方便上网者:
第一页 上一页 下一页 最后一页 输入页号: 总页数:
ASP程序实现如下:
'此处打开数据库联接及数据表对象
<%
If Request("Page") = "" Then Page=10
Page = CLng(Request("Page")) ' CLng 不可省略,用于将页码转换为长整型
If Page < 1 Then Page = 1
If Page > rs.PageCount Then Page = rs.PageCount
%>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=gb_2312-80">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>分页浏览数据库的技巧</title>
</head>
<body bgcolor="#FFFFFF">
<h2 align="center">利用SQL命令筛选数据记录</h2>
<hr>
<%
ShowOnePage rs, Page
%>
<hr>
<form action="当前文件.asp" method="GET">
<%
If Page <> 1 Then
Response.Write "<A HREF=PageS23.asp?Page=1>第一页</A>?"
Response.Write "<A HREF=PageS23.asp?Page=" & (Page-1) & ">上一页</A>?"
End If
If Page <> rs.PageCount Then
Response.Write "<A HREF=PageS23.asp?Page=" & (Page+1) & ">下一页</A>?"
Response.Write "<A HREF=PageS23.asp?Page=" & rs.PageCount & ">最后一页</A>?"
End If
%> <p align="right">输入页数:<input type="text" size="3"
name="Page"> 页数:<font color="#FF0000"><%=Page%>/<%=rs.PageCount%></font> </p>
</form>
</body>
</html>