电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> 数据库
通过 ASP 记录进行分页
作者:网友供稿 点击:18
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
简介

在 active server pages (asp) 应用程序中显示大型记录集,很可能是您熟悉的一个问题。本文对此问题及其解决方案和示例代码进行了深入探讨,这个示例代码经过简单修改,就可以应用于您的具体情况。该示例代码被设计成服务器端的解决方案,它与浏览器无关。另外,我会指出您在设计自己的解决方案时需要考虑的问题。

问题

您的查询返回了一个大型记录集。需要提供一个简便方法来浏览这些结果,即在每页上只显示结果的子集。要有效的完成此项工作,需要对 activex(r) 数据对象 (ado) 和数据库如何协同工作有深入的了解。

解决方案

如何将您的记录集分成“页”,而不用大型的结果?所谓页,基本上就是您指定应当显示在一起的许多记录。例如,如果您的记录集中有 100 条记录,可能每页显示 10 条记录。

ado 提供了两种方法,pagesize 和 absolutepage。这些方法使您能够指定每页要显示的记录数,以及将游标定位于一页的开始。

打开记录集之后,基本步骤就是:

为该记录集指定 pagesize。它表示每页要显示的记录数。
指定该记录集的 absolutepage。这将记录指针移到页的序列中,给定页的开始处。
显示记录页。要完成这一步,您要用设置的 pagesize 次数循环整个记录集,或者直到到达文件的末尾。
示例代码

下列示例代码说明了页面建立过程。借助它,您可以建立自己的解决方案的原型。在您自己的代码中,确保要完成下列步骤:

添加错误处理。
添加对查询返回的记录数的限制。
用条件过滤记录。(如,建立 where 子句)。
使用存储过程或视图。
一定要通过更改连接字符串和 sql 语句来修改我的示例代码,以指向您的数据库。由于代码使用 ado 常数,如 aduserserver,一定要在您的 global.asa 文件中引用 ado typelibrary,或在 asp 页中包括 adovbs.inc 文件。请注意,在将项目引用设置为 microsoft ado 时,visual interdev(r) 会为您自动生成 typelibrary 引用。

注意该示例有两种方法可以提供导航栏:

shownavbar。 它为用户提供了带着记录计数一起跳到指定页的方法(见图 1)。为实现这一步,它使用了 recordcount 和 pagecount 属性。
shownavbarfast。 该方法不提供跳转到指定页的能力,也不提供记录计数,但可以通过 cachesize 属性控制取回的记录数(见图 2)。
pagethroughrs.asp

<%@ language=vbscript %>
<% option explicit %>
<script language=vbscript runat=server>
确保引用 ado typelib 或使用 adovbs.inc
dim ipagenum, irowsperpage

main
sub main()
dim rst
dim ssql, sconnstring

if request.querystring("ipagenum") = "" then
ipagenum = 1
else
ipagenum = request.querystring("ipagenum")
ipagenum = cint(ipagenum)
end if

irowsperpage = 10


sconnstring = "provider=sqloledb.1;password=xyz123;user id=webuser;" & _
"initial catalog=northwind;data source=mysqlserver;" & _
"network=dbmssocn;"

下列 sql 从 sql 视图中检索所有列。
要优化性能:
- 使用存储过程、视图或在 select 中指定列
- 使用限制返回的记录的条件(例如,where 子句)
ssql = "select categoryname, productname, quantityperunit,"
ssql = ssql & "unitsinstock, discontinued"
ssql = ssql & " from [products by category]"

set rst = getrecords(sconnstring, ssql)

writetableheader rst
writetablebody rst, irowsperpage, ipagenum
shownavbar rst

showfastnavbar 方法不使用 recordcount
或 pagecount,所以它重试的记录数仅等于
记录集的 cachesize 指定的数量。

showfastnavbar rst

cleanup rst
end sub

function getrecords(sconnstring, ssql)
dim cnn
dim rst

set cnn = server.createobject("adodb.connection")
cnn.connectionstring = sconnstring
nn.open

set rst = server.createobject("adodb.recordset")

set rst.activeconnection = cnn

当记录集打开时,aduseclient 的 cursorlocation
将检索所有的记录。
aduseserver 允许沿用 cachesize
rst.cursorlocation = aduseserver

在使用服务器端游标时,cachesize
限制了取回的行数。我们将只抓取正在显示的
的记录的数目 - irowsperpage
rst.cachesize = irowsperpage

rst.open ssql,,adopenstatic, adlockreadonly牋?
set getrecords = rst
end function

sub writetableheader(rst)
dim fld

response.write "<table width=80% border=1>"
response.write "<tr>"

建立表的列标题
for each fld in rst.fields
response.write "<td><b>" & fld.name & "</b></td>"
next
response.write "</tr>"
end sub

sub writetablebody(rst, irowsperpage, ipagenum)
dim iloop
dim fld

iloop = 1

rst.pagesize = irowsperpage
rst.absolutepage = ipagenum

写出记录的当前页
do while (not rst.eof) and (iloop <= irowsperpage)
response.write "<tr>"
for each fld in rst.fields
response.write "<td>" & fld.value & "</td>"
next
iloop = iloop + 1
rst.movenext
response.write "</tr>"
loop
response.write "</table>"
end sub

sub shownavbar(rst)
dim ipagecount
dim iloop
dim sscriptname

本版本提供了更丰富的用户导航,但是
依赖于 recordcount 和 pagecount,
它抵消了为服务器端游标
指定 cachesize 的好处。

response.write "<br><br>"
sscriptname = request.servervariables("script_name")

if ipagenum > 1 then
response.write " <a href=" & sscriptname & "?ipagenum="
response.write (ipagenum -1) & "><< previous</a>"
end if

ipagecount = rst.pagecount
do until iloop > ipagecount
f iloop = ipagenum then
response.write " <b>" & cstr(iloop) & "</b>"
else
response.write " <a href=" & sscriptname & "?ipagenum=" & _
cstr(iloop) & ">" & iloop & "</a>"
end if
iloop = iloop + 1
loop

if not rst.eof then
response.write " <a href=" & sscriptname & "?ipagenum="
response.write (ipagenum +1) & "> next >></a><br>"
else
response.write "<br>"
end if

response.write "page " & ipagenum & " of " & ipagecount & "<br>"
response.write rst.recordcount & " records" 牋?
end sub

sub showfastnavbar(rst)
dim ipagecount
dim iloop
dim sscriptname

在指定 cachesize 和使用服务器端游标时,
该方法特别有效,因为它不使用 recordcount
和 pagecount。需要用户具有经验。

response.write "<br><br>"
sscriptname = request.servervariables("script_name")

if ipagenum > 1 then
response.write " <a href=" & sscriptname & "?ipagenum="
response.write (ipagenum -1) & "><< previous</a>"
end if

if not rst.eof then
response.write " <a href=" & sscriptname & "?ipagenum="
response.write (ipagenum +1) & "> next >></a><br>"
else
response.write "<br>"
end if

response.write "page " & ipagenum

end sub

sub cleanup(rst)
if not rst is nothing then
if rst.state = adstateopen then rst.close
set rst = nothing
end if
end sub

</script>
分析

设计分页解决方案时,需注意的几个问题:

游标定位问题。如果使用客户端游标,每次打开记录集时,将读取所有的记录。因此,由于读取了所有的记录,以后访问 recordcount 或 pagecount 属性时将很快。如果您使用服务器端游标,将只检索需要的记录。您可以通过 cachesize 属性指定一次要读取的记录数来提高性能。然而,如果您使用服务器端游标,和 recordcount 或 pagecount 属性,则将读取所有的记录,性能得不到提高。必须在具有更多信息和更丰富导航的用户界面,与检索所有记录的性能影响之间折衷。
使用服务器端游标时,cursortype 属性必须是 adopenstatic 或 adopenkeyset,才能使用分页。
分页并非总是最好的用户页面。它可能仅适用于用户正从搜索引擎扫描结果或浏览产品目录的情况。
试将记录分类,以使更相关的记录出现在前几页中(例如,使用 sql 的 order by 子句)。用户所能做的就这么多。
只检索需要显示的列(即,避免 select *)。
只检索需要显示的记录。确保过滤的条件(即,使用 where 子句)。
以下是需要牢记的几点提示:

将您的逻辑封装在方法中。使用方法可将表示逻辑和数据访问逻辑分离,这就简化了将代码装入 windows 脚本组件、visual basic 脚本编辑 (vbscript) 类或组件的工作。改变功能更容易了,代码维护也得以改进。测试和调试也因可以注释和取消注释方法调用而得到改进。
与包括 adovbs.inc 相比,引用 ado 的 typelibrary 是更好的解决方案。这是因为 asp 在处理包含文件时,是将整个文件读入内存,而不是只读入它需要的部分。
结论

分页是一项通用技术,许多 web 应用程序用它来提供浏览大量记录的好方法。在设计分页解决方案时,需要考虑一些问题,如,如何检索记录,需要提供什么类型的用户导航。尽管最好的解决方案取决于您的具体的应用程序,使用本文中的技术将帮助您作出更好的设计决策。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·数据库开发个人总结(ADO.NET小结)-.NET教程,数据库应用
·怎么由DataSet将数据导入Excel?-.NET教程,数据库应用
·动态创建SQL Server数据库、表、存储过程-ASP教程,数据库相关
·Win32环境下动态链接库(DLL)编程原理-.NET教程,数据库应用
·封装的ADO.NET对数据库操作经典类-.NET教程,数据库应用
·在DataGridView中获得DataGridViewCheckBoxColumn的状态-ASP教程,数据库相关
·DataGrid使用心得(附大量代码)-ASP教程,数据库相关
·用代码创建DataGrid的多链接及checkbox事件响应-.NET教程,数据库应用
·ADO.NET 的最佳实践技巧-.NET教程,数据库应用
·转载: 用纯ASP代码实现图片上传并存入数据库中

最新文章
·根据数据表中数据,生成Powerpoint幻灯片-ASP教程,数据库相关
·DataGrid中的按钮反选事件与NamingContainer(命名容器)-downmoon-ASP教程,数据库相关
·使用用VB处理MYSQL数据库中二进制数据问题-.NET教程,VB.Net语言
·关于DataGridView中如何接收处于编辑状态下的当前信息-ASP教程,数据库相关
·在DataGridView中获得DataGridViewCheckBoxColumn的状态-ASP教程,数据库相关
·.net下访问Access数据库需要注意的问题-.NET教程,Asp.Net开发
·ActiveMQ4.1+Spring2.0的POJO JMS方案(上)-.NET教程,数据库应用
·ASP.NET 2.0中直接将Access数据库导入到Excel文件中-.NET教程,Asp.Net开发
·NET(C#)连接各类数据库-集锦-.NET教程,C#语言
·ASP.NET2.0连接SQL Server数据库详解-.NET教程,Asp.Net开发




版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号