ASP基础入门:ADO存取数据库时如何分页显示

作者&投稿:后泼 (若有异议请与网页底部的电邮联系)
~
《动态网站设计十八般武艺 --ASP 篇》一文从第一期至今已和朋友们一起度过了大半个年头,相信通过在这一段时间中的学习、实践到再学习、再实践,大家已经能够熟练运用 ASP 的内建对象、 ActiveX 组件去编写一些基本的 ASP 应用程序。从我收到的朋友们的来信中可以明显的感觉到,大家的 ASP 功力正不断地提升。最近很多朋友来信希望我写一些 ASP 在现实运用中的实例。因此,从本期开始我决定将《动态网站设计十八般武艺 --ASP 篇》的定位从介绍和学习 ASP 基础知识转向到 ASP 实际运行的探讨和深化。应朋友们的要求,在本期中我将给大家着重谈一谈“ADO 存取数据库时如何分页显示”的问题。
什么是 ADO 存取数据库时的分页显示?如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多页显示,每页显示一定数目的帖子数,譬如 20 条。这就是数据库查询的分页显示,如果你还不明白,去看看 yahoo 等搜索引擎的查询结果就会明白了。
那么究竟如何才能做到将数据库的查询结果分页显示呢?其实方法有很多,但主要有两种:
一、将数据库中所有符合查询条件的记录一次性的都读入 recordset 中,存放在内存中,然后通过 ADO Recordset 对象所提供的几个专门支持分页处理的属性: PageSize( 页大小 )、 PageCount( 页数目 ) 以及 AbsolutePage( 绝对页 ) 来管理分页处理。
二、根据客户的指示,每次分别从符合查询条件的记录中将规定数目的记录数读取出来并显示。
两者的主要差别在于前者是一次性将所有记录都读入内存然后再根据指示来依次做判断分析从而达到分页显示的效果,而后者是先根据指示做出判断并将规定数目的符合查询条件的记录读入内存,从而直接达到分页显示的功能。
我们可以很明显的感觉到,当数据库中的记录数达到上万或更多时,第一种方法的执行效率将明显低于第二种方法,因为当每一个客户查询页面时都要将所有符合条件的记录存放在服务器内存中,然后在进行分页等处理,如果同时有超过 100 个的客户在线查询,那么 ASP 应用程序的执行效率将大受影响。但是,当服务器上数据库的记录数以及同时在线的人数并不是很多时,两者在执行效率上是相差无几的,此时一般就采用第一种方法,因为第一种方法的 ASP 程序编写相对第二种方法要简单明了得多。
在这里作者就以我们常见的 ASP BBS 程序为例,来给大家分析一下如何在 BBS 程序里实现分页显示功能,由于我们一般使用的 BBS 程序的数据库记录数和同时访问的人数都不会太多,所以以下程序实例是使用的先前所介绍的第一种分页显示方法。
进行 ADO 存取数据库时的分页显示,其实就是对 Recordset 的记录进行操作。所以我们首先必须了解 Reordset 对象的属性和方法:
BOF 属性:目前指标指到 RecordSet 的第一笔。
EOF 属性:目前指标指到 RecordSet 的最后一笔。
Move 方法:移动指标到 RecordSet 中的某一条记录。
AbsolutePage 属性:设定当前记录的位置是位于哪一页 AbsolutePosition 属性:目前指标在 RecordSet 中的位置。
PageCount 属性:显示 Recordset 对象包括多少“页”的数据。
PageSize 属性:显示 Recordset 对象每一页显示的记录数。
RecordCount 属性:显示 Recordset 对象记录的总数。
下面让我们来详细认识一下这些重要的属性和方法
一、 BOF 与 EOF 属性
通常我们在 ASP 程序中编写代码来检验 BOF 与 EOF 属性,从而得知目前指标所指向的 RecordSet 的位置,使用 BOF 与 EOF 属性,可以得知一个 Recordset 对象是否包含有记录或者得知移动记录行是否已经超出该 Recordset 对象的范围。
如:
% if not rs.eof then ... %
% if not (rs.bof and rs.eof) %
若当前记录的位置是在一个 Recordset 对象第一行记录之前时, BOF 属性返回 true,反之则返回 false。
若当前记录的位置是在一个 Recordset 对象最后一行记录之后时, EOF 属性返回 true,反之则返回 false。
BOF 与 EOF 都为 False:表示指标位于 RecordSet 的当中。
BOF 为 True:目前指标指到 RecordSet 的第一笔记录。 EOF 为 True:目前指标指到 RecordSet 的最后一笔记录。
BOF 与 EOF 都为 True:在 RecordSet 里没有任何记录。
二、 Move 方法
您可以用 Move 方法移动指标到 RecordSet 中的某一笔记录,语法如下:
rs.Move NumRecords,Start
这里的“rs”为一个对象变量,表示一个想要移动当当前记录位置的 Recordset 对象;“NumRecords”是一个正负数运算式,设定当前记录位置的移动数目;“start”是一个可选的项目,用来指定记录起始的标签。
所有的 Recordset 对象都支持 Move 方法,如果 NumRecords 参数大于零,当前记录位置向末尾的方向移动;如果其小于零,则当前记录位置向开头的方向移动;如果一个空的 Recordset 对象调用 Move 方法,将会产生一个错误。
MoveFirst 方法:将当前记录位置移至第一笔记录。
MoveLast 方法:将当前记录位置移至最后一笔记录。
MoveNext 方法:将当前记录位置移至下一笔记录。 MovePrevious 方法:将当前记录位置移至上一笔记录。
Move [n] 方法:移动指标到第 n 笔记录, n 由 0 算起。
三、 AbsolutePage 属性
AbsolutePage 属性设定当前记录的位置是位于哪一页的页数编号;使用 PageSize 属性将 Recordset 对象分割为逻辑上的页数,每一页的记录数为 PageSize( 除了最后一页可能会有少于 PageSize 的记录数 )。这里必须注意并不是所有的数据提供者都支持此项属性,因此使用时要小心。
与 AbsolutePosition 属性相同, AbsolutePage 属性是以 1 为起始的,若当前记录为 Recordset 的第一行记录, AbsolutePage 为 1。可以设定 AbsolutePage 属性,以移动到一个指定页的第一行记录位置。
四、 AbsolutePosition 属性
若您需要确定目前指标在 RecordSet 中的位置,您可以用 AbsolutePosition 属性。
AbsolutePosition 属性的数值为目前指标相对於第一笔的位置,由 1 算起,即第一笔的 AbsolutePosition 为 1。
注意 , 在存取 RecordSet 时,无法保证 RecordSet 每次都以同样的顺序出现。
若要启用 AbsolutePosition,必须先设定为使用用户端 cursor( 指针 ), asp 码如下:
rs2.CursorLocation = 3
五、 PageCount 属性
使用 PageCount 属性,决定 Recordset 对象包括多少“页”的数据。这里的“页”是数据记录的集合,大小等于 PageSize 属性的设定,即使最后一页的记录数比 PageSize 的值少,最后一页也算是 PageCount 的一页。必须注意也并不是所有的数据提供者都支持此项属性。
六、 PageSize 属性
PageSize 属性是决定 ADO 存取数据库时如何分页显示的关键,使用它就可以决定多少记录组成一个逻辑上的“一页”。设定并建立一个页的大小,从而允许使用 AbsolutePage 属性移到其它逻辑页的第一条记录。 PageSize 属性能随时被设定。
七、 RecordCount 属性
这也是一个非常常用和重要的属性,我们常用 RecordCount 属性来找出一个 Recordset 对象包括多少条记录。如:
% totle=RS.RecordCount %
在了解了 Recordset 对象的以上属性和方法后,我们来考虑一下,如何运用它们来达到我们分页显示的目的。首先,我们可以为 PageSize 属性设置一个值,从而指定从记录组中取出的构成一个页的行数;然后通过 RecordCount 属性来确定记录的总数;再用记录总数除以 PageSize 就可得到所显示的页面总数;最后通过 AbsolutePage 属性就能完成对指定页的访问。好象很并不复杂呀,下面让我们来看看程序该如何实现呢?
我们建立这样一个简单的 BBS 应用程序,它的数据库中分别有以下五个字段:“ID”,每个帖子的自动编号;“subject”,每个帖子的主题;“name”,加帖用户的姓名; “email”,用户的电子邮件地址;“postdate”,加帖的时间。数据库的 DSN 为“bbs”。我们将显示帖子分页的所有步骤放在一个名为“ShowList()”的过程中,方便调用。程序如下:
\'----BBS 显示帖子分页----
% Sub ShowList() %
%
PgSz=20 \'设定开关,指定每一页所显示的帖子数目,默认为20帖一页
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
sql = "SELECT * FROM message order by ID DESC"
\'查询所有帖子,并按帖子的ID倒序排列
Conn.Open "bbs"
RS.open sql,Conn,1,1
If RS.RecordCount=0 then
response.write " P center对不起,数据库中没有相关信息! /center /P"
else
RS.PageSize = Cint(PgSz) \'设定PageSize属性的值
Total=INT(RS.recordcount / PgSz * -1)*-1 \'计算可显示页面的总数
PageNo=Request("pageno")
if PageNo="" Then
PageNo = 1
else
#p#副标题#e#
PageNo=PageNo+1
PageNo=PageNo-1
end if
ScrollAction = Request("ScrollAction")
if ScrollAction = " 上一页 " Then
PageNo=PageNo-1
end if
if ScrollAction = " 下一页 " Then
PageNo=PageNo+1
end if
if PageNo
1 Then
PageNo = 1
end if
n=1
RS.AbsolutePage = PageNo
Response.Write " CENTER"
position=RS.PageSize*PageNo
pagebegin=position-RS.PageSize+1
if position
RS.RecordCount then
pagend=position
else
pagend= RS.RecordCount
end if
Response.Write " P font color=\'Navy\' B数据库查询结果: /B"
Response.Write "(共有"RS.RecordCount "条符合条件的信息,显示"pagebegin"-"pagend") /font /p"
Response.Write " TABLE WIDTH=600 BORDER=1 CELLPADDING=4 CELLSPACING=0 BGCOLOR=#FFFFFF"
Response.Write " TR BGCOLOR=#5FB5E2 FONT SIZE=2 TD B主题 /B /TD TD B用户 /B /TD TD BEmail /B /TD TD B发布日期 /B /TD /FONT TR BGCOLOR=#FFFFFF"
Do while not (RS is nothing)
RowCount = RS.PageSize
Do While Not RS.EOF and rowcount 0
If n=1 then
Response.Write " TR BGCOLOR=#FFFFFF"
ELSE
Response.Write " TR BGCOLOR=#EEEEEE"
End If
n=1-n %
TD span style="font-size:9pt" A href=\'view.asp?key= % =RS("ID")%\' % =RS("subject")% /A /span /td
TD span style="font-size:9pt" % =RS("name")% /A /span /td
TD span style="font-size:9pt" a href="mailto: % =RS("email")%" % =RS("email")% /a /span /TD
TD span style="font-size:9pt" % =RS("postdate")% /span /td
/TR
%
RowCount = RowCount - 1
RS.MoveNext
Loop
set RS = RS.NextRecordSet
Loop
Conn.Close
set rs = nothing
set Conn = nothing
%
/TABLE
FORM METHOD=GET ACTION="list.asp"
INPUT TYPE="HIDDEN" NAME="pageno" VALUE=" % =PageNo %"
%
if PageNo 1 Then
response.write " INPUT TYPE=SUBMIT NAME=\'ScrollAction\' VALUE=\' 上一页 \'"
end if
if RowCount = 0 and PageNo
Total then
response.write " INPUT TYPE=SUBMIT NAME=\'ScrollAction\' VALUE=\' 下一页 \'"
end if
response.write " /FORM"
End if
%
% End Sub %
相信大家都应该能完全读懂上面的程序,因此作者就不在此详细解释了。值得注意的是在这段程序中运用了一个小技巧
INPUT TYPE="HIDDEN" NAME="pageno" VALUE=" % =PageNo %"
,这是用来在每次调用该 ASP 文件时传递数据的“暗道”,由于我们需要在每次调用程序时传递代表当前页码的参数,可能大家会想到使用 session,但是从节省系统资源和通用性来讲,用这样一个隐藏的 form 来传递数据将会达到更好的效果。#p#副标题#e#



无线互联网是什么
实际上手机的短信业务就是无线互联网的基本数据交换形式,同时符合双向数据传输。 目前出现的移动梦网和联通在线实际上是无线互联网的几个门户站点。还不足以支撑无线互联网的概念。 目前有些SP宣称自己为无线互联网,这是偷换概念的行为。实际上SP之间不能直接进行数据交换,何来无线互联网一说呢?2004年10月份几个互联...

新加坡的EP和SP是什么意思
1、EP(Employment Pass)一般是针对高级管理,行政或者专业技术人才,月薪在至少3600新币以上而发出的一种工作签证。针对申请赴新加坡从事高层次管理或技术工作的人士,即国内的"金领"人士。年轻的申请者需拥有优秀院校的毕业证书,而年长的申请人必须拥有更高的薪水以及更强的工作经验和专业技能。2、SP(...

新媒体运营资料
\/\/www.aliyundrive.com\/s\/aD...844b86feed6191a102e资源链接:https:\/\/www.aliyundrive.com\/s\/aDsNPRRYFJj零基础入门,90天系统掌握运营知识体系(第2期)发布时间:2023-02-2003:08:54文件大小:共计23个文件,合计:3.5GB资源链接:https:\/\/www.aliyundrive.com\/s\/Ug...29d8eb7c446b5125250资源链接:https:...

这些缩写是什么意思:AM,AD,ADM,EMS,EC,EA,ENG,ES,SSD,EMS,DSSD,CCM,A...
Supplier Quality Assurance 供应商来料质量管理CA,Credit Analyst 信用分析HR,Human Resource 人力资源SMC,Senior Management Clerk 高级行政文员;Scientific Manpower Commission 科学人力委员会SP,Service Provider 服务提供商TE,Test Engineer 测试工程师EE,Environmental Engineer 环境工程师Electrical ...

sql常用语句,帮我归纳出来,谢谢
SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack...

sp中口袋妖怪绿宝石的金手指是什么?怎么用金手指?
003f 最大上升(体力基础值提高) 0040 赞美语(攻击基础值提高) 0041 落海夫(防御基础值提高) 0042 因得西(敏捷基础值提高) 0043 立麦森(特攻基础值提高) 0044 奇异甜食(怪兽升1级) 0045 值上升(技能值的最大值上升) 0046 极道山果(特防基础值提高) 0047 值最大(技能值提高到最大) 0048 ???(???) 004...

谁可以把corelDRAW和CAD与3DMAX的所有快捷键给我
这个是全部了..好好珍藏 这里列出PhotoShop中的绝大多数常用快捷键,希望会给经常使用PhotoShop的朋友带来方便。取消当前命令:Esc;工具选项板:Enter;选项板调整:Shift+Tab;退出系统:Ctrl+Q;获取帮助:F1;剪切选择区:F2 \/ Ctrl+X;拷贝选择区:F3 \/ Ctrl+C;粘贴选择区:F4 \/ Ctrl+V;...

Dota imba 3.81b的模式命令
-ad 近卫防守模式:此模式下近卫军团不会产生任何兵种,天灾军团每一段时间会获得额外的金钱及经验值,但若在20分钟(在开启NT\/NB模式的情况下,每少一路兵限定时间减少4分钟)内不能摧毁近卫终极建筑,则判定天灾失败。此模式下近卫方的建筑物会获得50点攻击力,500点生命值,以及基础20%,每分钟提高...

MP2014AD 开机出现维修呼叫SC542-01
理光2014AD报sc542-01清除方法:1、连续按 停止 1 0 7 开始,进入维修模式 2、选择第三项Engine SP Mode,按确定 3、选择第五 Mode,点确定 4、按向下箭头,选择810 SC Reset 即SC代码清除,按确定 5、这里只有一项 Fusing SC Reset,直接按确定。6、然后按屏幕上Yes下方对应的向下小三角箭头,...

求科普,动漫里的CM、OP、ED、SP、PV、OVA、OVB等等。越多越详细越好...
CM有两种;一是Commercial Message的缩写 英文解释:a commercially sponsored ad on radio or television 中文解释:商业广播广告,日本的广告领域力,CM被当做广告简称,在其国内广泛应用。例如:伊藤洋华堂SUPER☆GiRLSイトーヨーカドー 春のザ?セール(这是一则广告),而且是SUPER☆GiRLS日本女团成员...

林芝县15738626241: 在ASP页面中存取数据库中数据的一般步骤是什么? -
布马誉舒: 一,调用ADO或其它数据库连接方式(如ODBC)来创建一个程序到数据库的连接.并得到一个ADO.Connection对象.(需要配置一个连接字符串) 二,调用Connection的Execute方法向数据库发送一条SQL语句.三,增删改的情况下,操作完成,关闭数据库.四,查询的情况下,ADO会将查询结果放入RecordSet对象集,需要遍历该对象集以取得每一条记录的内容.五,操作完成后,关闭数据库

林芝县15738626241: ADO 存取数据库时如何分页显示 -
布马誉舒: 其实方法有很多,但主要有两种: 一、将数据库中所有符合查询条件的记录一次性的都读入 recordset 中,存放在内存中,然后通过 ADO Recordset 对象所提供的几个专门支持分页处理的属性: PageSize( 页大小 )、 PageCount( 页数目 ...

林芝县15738626241: asp中的数据库连接 -
布马誉舒: 一、ASP的对象存取数据库方法 在ASP中,用来存取数据库的对象统称ADO(Active Data Objects),主要含有三种对象: Connection、Recordset 、Command Connection:负责打开或连接数据 Recordset:负责存取数据表 Command:...

林芝县15738626241: asp怎么链接sql数据库
布马誉舒: 我空间里有,不同的数据库有不同的链接方式,代码如下: 一、ASP的对象存取数据库方法 在ASP中,用来存取数据库的对象统称ADO(Active Data Objects),主要含有三种对象: Connection、Recordset 、Command Connection:负责打开...

林芝县15738626241: asp连接sql数据库有几种方法啊???
布马誉舒: 用ASP连接各种数据库的方法一、ASP的对象存取数据库方法 在ASP中,用来存取数据库的对象统称ADO(Active Data Objects),主要含有三种对象:Connection、Recordset 、Command Connection:负责打开或连接数据 Recordset:负责存...

林芝县15738626241: 详细比较在ASP中通过ADO接口实现对数据库访问的三种不同格式的特点 -
布马誉舒: 在ASP脚本中可以通过三种方式访问数据库:● IDC(Internet Database Connector)方式● ADO(ActiveX Data Objects)方式● RDS(Remote Data Service)方式从概念上来讲,这三种访问方式对数据库的访问是由Internet Information Server来...

林芝县15738626241: asp 代码建立数据库! -
布马誉舒: 用ASP连接DBF、DBC、MDB、Excel、SQL Server型数据库的方法:一、ASP的对象存取数据库方法 在ASP中,用来存取数据库的对象统称ADO(Active Data Objects),主要含有三种对象:Connection、Recordset 、CommandConnection:...

林芝县15738626241: 如何制作数据库? -
布马誉舒: 如何制作数据库?用最简单的语言ASP来做数据库,以ASP举例. 1、问题:ASP是一种编程语言吗? 答:ASP不是编程语言,而是一种开发环境.ASP提供了一个在服务器端执行指令的环境,它利用了特殊的符号<>来区分HTML与必须经过服...

林芝县15738626241: ASP教程哪有?
布马誉舒: 1.天极网 http://www.mydown.com/tests/507220158595465216.html 2.快枪手搜索 http://www.fastgun.net/so/class/top50_89.htm 3.ASP酷技术网 http://www.aspcool.com/

林芝县15738626241: 在asp中用ADO访问数据库时,如果刚打开了一个含有0条记录的记录数,那么记录集的BOF属性的值是 -
布马誉舒: b

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网