ASP查询分页显示
惊鸿
2000年 第21期
数据库查询是网络编程中最常用的功能之一,在一个实用的商业网站中,一次查询的结果很可能多达数百条记录,单屏显示极不方便,因此需要用到分页显示技术。ASP配合ADO的RecordSet对象,提供了一个实现分页的简明途径,下面就一段示例代码进行详解。
在解说之前,做如下假设:将以下代码存为pagelist.asp,并在同一目录下建一数据库studentlib.mdb,库中有表student01,含三个字段,即“学号”、“姓名”和“班级”,然后输入相应记录即可。将pagelist.asp与studentlib.mdb同置于Web服务器虚拟目录下,即能用浏览器观察结果了。
<%=″
记录查询分页显示″%>
<%
PSize=5 ′指定每一页所显示的记录数目。
Set Conn = Server.CreateObject(″ADODB.Connection″)
Set Rs_main = Server.CreateObject(″ADODB.RecordSet″)
′ADODB.RecordSet类提供了访问数据库的便捷方法,此处建立它的实例并赋予变量Rs_mainDBPath = Server.MapPath(″studentlib.mdb″)。
′Server是ASP内置对象,此处用其MapPath方法将所用数据库的相对路径映射为物理路径conn.Open ″driver={Microsoft Access Driver (*.mdb)};dbq=″ & DBPath。
′这里直接指定了数据源,也可以在“控制面板”中的“32位ODBC”中建立数据源,并在此处使用conn.Open ″数据源名″。
sql = ″SELECT * FROM student01 order by 学号″
′查询所有记录,并按记录的学号排列,实际应用中,你可用从表单获取的查询字符串来代替它。
Rs_main.open sql,Conn,1,1
′以只读方式打开数据源并执行查询,如果是写方式则应该是Rs_mian.open sql,Conn,1,3。
If Rs_main.RecordCount=0 then
response.write ″
对不起,数据库中没有相关信息!″
else
Rs_main.PageSize = Cint(PSize)
′设定PageSize属性的值,这是RecordSet对象进行分页显示最重要的属性,指定它也就指定了每页显示的记录数,同时也就等于指定了其另一属性PageCount,即总页数的值,这样就完成了在逻辑上对查询结果的分页。
PageN=Request(″tempage″)
if PageN=″″ Then
PageN = 1
end if
SA = Request(″Coms″)
if SA = ″ 上一页 ″ Then
PageN=PageN-1
elseif SA = ″ 下一页 ″ Then
PageN=PageN+1
elseif SA = ″ 确 定 ″ Then
PageN=Request(″p″)
′此处容错略,应防止传来不合范围的页号。
end if
′以上几句用来确定要显示的页号。在本程序的最后设了一个表单,包括上下页按钮,接收用户键入页号的文本框及一个隐藏元素,都是用来传递页号的。
Rs_main.AbsolutePage = PageN
′将页号赋予AbsolutePage属性。这是分页显示中又一个关键属性,将页号赋予它的作用便是当前记录指针被移到了该页的首条记录上。
Response.Write ″″
pagebegin=Rs_main.PageSize*(PageN-1)+1
if Rs_main.PageSize*PageN < Rs_main.RecordCount then
pagend=Rs_main.PageSize*PageN
else
pagend= Rs_main.RecordCount
end if
′计算当前页记录的起始和终止位置。注意,这里得到的两个值是从1开始的,仅是供显示用,告诉用户当前显示的是从第几条到第几条,而不是真正的记录号,真正的记录号是从0开始的。
n=1′配合下面的n=1-n句,轮换表格背景色,提高显示效果。
Total=Rs_main.PageCount ′将总页数赋予Total。
Response.Write ″数据库查询结果:″
Response.Write ″(共有″&Rs_main.RecordCount&″条符合条件的信息,分″&Total&″页,显示第″&PageN&″页[″&pagebegin&″-″&pagend&″])
″Response.Write ″″
Response.Write ″学号 | 姓名 | 班级 |
″
′以上显示查询信息和表头。
RC = Rs_main.PageSize ′将每页记录数赋予RC作为循环变量。
Do While Not Rs_main.EOF and RC > 0
If n=1 then
Response.Write ″
″
ELSE
Response.Write ″
″
End If
n=1-n %>
<% =Rs_main(″学号″)%> |
<% =Rs_main(″姓名″)%> |
<% =RS_main(″班级″)%> |
<%
RC = RC - 1
Rs_main.MoveNext
Loop
′以上循环在表格中显示查询结果中的当前页所有记录,RecordSet对象(″字段名″)代表的即为当前记录中该字段的值。MoveNext方法为移动指针到下条记录,相应还有:MovePrev(移到上一记录)MoveFirst(移到第一条记录)MoveLast(移到最后一条记录)等。
Conn.Close
set Rs_main = nothing
set Conn = nothing
%>
′以上关闭与释放各对象引用。
″
′以上这个表单,综合提供给了用户查看不同页面的手段。
end if
%>
怎么样,看到查询结果一页页显示出来时,你是否会很开心呢?这里只是用ACCESS数据库做个例子,真正应用中,你也可以把它用在SQL Server或ORACLE数据库中。好了,有什么疑问的话,请和我联系,我的E-mail是:netsurf@990.net