当前位置: 首页 > 图文教程 > 网络编程 > ASP > 在ASP中改善动态分页的性能

ASP
ASP正则表达式技巧
ASP Access实现网站计数器(访问量)
ASP新闻分页,将一篇过长的文章分页,生成静态页面
一些关于asp 购物车的想法
一个sql查询器,自动画表格填字段
ASP实现文件直接下载的代码
把网页中的(电话,qq等数字)生成图片的ASP程序
asp长文章用分页符来分页显示
Asp函数介紹(37个常用函数)
ASP中的面向对象类
分页实现方法的性能比较
asp ajax跨域提交数据
asp修改文件和文件夹的名字的代码
ASP 多关键词查询实例代码
asp被杀毒软件误删的解决方法
asp 多关键词搜索的简单实现方法
asp 根据IP地址自动判断转向分站的代码
asp dictionary对象的用法
ASP 千万级数据分页的存储过程
ASP隐藏真实文件的下载功能实现代码

在ASP中改善动态分页的性能


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 106 ::
收藏到网摘: n/a

  原作:张立锋 张 禾

概 述  
现在有不少介绍利用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=< %=