概 述
---- 现在有不少介绍利用asp实现动态分页的文章,方法大同小异,就是每次利用ado返回原始数据满足条件记录集中的指定页。但在实际工程应用中,原始数据量通常很大,原始数据的加工比较慢,如果每次换页原始数据都要加工一次,则会严重影响应用程序运行的性能。
---- 解决上述问题主要有两种途径:一种途径是将查询条件相对固定,利用相对固定的查询条件对原始数据进行加工,生成一个小数据量的中间库,每次查询都对中间库进行操作。这样虽然会提高程序的性能,但会影响程序的灵活性,而且 server端还需定时对原始数据进行加工维护。另一个途径是在server端保存查询的结果。这样虽然不能改善查询的性能,但client端换页时server端能够很快响应。第一种途径的实现比较简单,本文介绍第二种途径的实现方法。
实现方法
----将server端的查询结果保存在一个动态数组中,即在 session_onstart过程中声明一个二维的动态数组。当server端收到client端提交的申请后,首先判断申请是条件查询还是换页,如是条件查询则判别查询条件是否与上次提交的查询条件不同,如不同则执行查询,将查询结果保存在该数组中,然后向client端返回第一页的内容,否则直接从该数组中返回相应页的内容。
程序实现
----1.定义二维数组及其他变量
sub session_onstart
dim tempdb()
redim preserve tempdb(1,2)
session(“storedarray") = tempdb
’定义一个session数组
session(“ipagecount")=0
session(“ipageno")=0
......
end sub
----2.调用存储过程返回数据
sub getrecordset(strbbmc,strkssj ,
strzzsj ,strnodecode ,strfxzl )
''参数为报表名称和各个限制条件
select case strbbmc
case “交易汇总表"
strcnn=“provider=msdasql;dsn=sqldb;
uid=sa;pwd=123456;database=vlog;"
set objcnn=server.createobje(“adodb.connection")
objcnn.commandtimeout = 9999999
objcnn.connectiontimeout = 99999999
objcnn.cursorlocation = aduseclient
objcnn.open strcnn ''打开连接
set objrs =server.createobject
(“adodb.recordset")
objrs.pagesize = ipagesize
objrs.cachesize = ipagesize
objrs.open “sszhatmlog ‘“ & strkssj & "'' ,
‘“ & strzzsj & "'', ‘“ & strnodecode & "'' ,
‘“ & strfxzl & "''",objcnn,adopenstatic ,
adlockreadonly,1
’执行存储过程返回查询结果
......
end sub
----3.将查询结果保存到动态数组
sub saverecordset()
if objrs.eof = false then
objrs.movelast
session(“irowcount") = objrs.recordcount
session(“ifieldcount") = objrs.fields.count
session(“ipagecount") = objrs.pagecount
redim preserve temparray(session
(“irowcount"),session(“ifieldcount"))
’temparray是一个二维动态数组,
根据记录集大小重新定义其大小
objrs.movefirst
icount=0
do while objrs.eof=false
icount = icount + 1
for i= 1 to session(“ifieldcount")
temparray(icount,i)=objrs.fields.item
(i-1).value
next
objrs.movenext
loop
session(“storedarray") = temparray
objrs.close
else
session(“ipagecount") = 0
end if
end sub
----4.显示记录内容
sub showrecord()
......
localarray=session(“storedarray")
ishowtotal=(ipagecurrent-1)*ipagesize+1
irowloop = 1
do while irowloop < = ipagesize and ishowtotal
< = session(“irowcount")
response.write(“< tr >")
for i = 1 to session(“ifieldcount")
response.write(“< td >"
& localarray(ishowtotal,i)) next
response.write(“< /tr >")
ishowtotal = ishowtotal + 1
irowloop = irowloop + 1 loop
response.write(“< /table >")
if ipagecurrent < > 1 and
ipagecurrent < session
(“ipagecount") then
% >
< center >< a href=“db_pag.asp?page=< %=
ipagecurrent - 1 % >" >前一页< /a >< a href=
“db_pag.asp?page=< %= ipagecurrent + 1 % >" >
后一页< /a >< /center >
< %
else
if ipagecurrent < > 1 then
% >
< center >< a href=“db_pag.asp?page=< %=
ipagecurrent - 1 % >" >前一页 < /a >< /center >
< %
end if
if ipagecurrent < session(“ipagecount")then
% >
< center >< a href=“db_pag.asp?page=
< %= ipagecurrent + 1 % >" >后一页 < /a >
< /center >
< %
end if
end if
end sub
----5.主程序
if request.querystring(“page") = “" then
’提交查询申请并且查询条件与上一次不同
......
call getrecordset(strbbmc,strkssj,strzzsj,
strnodecode,strfxzl)
call saverecordset
else
ipagecurrent=cint(request.querystring(“page"))
strkssj=session(“strkssj")
end if
if session(“ipagecount") = 0 then
response.write “抱歉!没有满足条件的记录"
response.write “< br >"
else
call showrecord()
end if
结束语
----本程序的关键在于session数组的定义及其赋值的实现,通过应用session数组可以提高处理大量数据的应用程序的性能。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器