∈裁词?ADO 存取数据库时的分页显示?如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多页显示,每页显示一定数目的帖子数,譬如 20 条。想不想了解如何实现分页显示?请看本文!

《动态网站设计十八般武艺 --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 对象的范围。

如: $#@60; % if not rs.eof then ... %$#@62;

$#@60; % if not (rs.bof and rs.eof) %$#@62;

若当前记录的位置是在一个 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 对象包括多少条记录。如: $#@60; % totle=RS.RecordCount %$#@62;

在了解了 Recordset 对象的以上属性和方法后,我们来考虑一下,如何运用它们来达到我们分页显示的目的。首先,我们可以为 PageSize 属性设置一个值,从而指定从记录组中取出的构成一个页的行数;然后通过 RecordCount 属性来确定记录的总数;再用记录总数除以 PageSize 就可得到所显示的页面总数;最后通过 AbsolutePage 属性就能完成对指定页的访问。好象很并不复杂呀,下面让我们来看看程序该如何实现呢?

我们建立这样一个简单的 BBS 应用程序,它的数据库中分别有以下五个字段:“ID”,每个帖子的自动编号;“subject”,每个帖子的主题;“name”,加帖用户的姓名;“email”,用户的电子邮件地址;“postdate”,加帖的时间。数据库的 DSN 为“bbs”。我们将显示帖子分页的所有步骤放在一个名为“ShowList()”的过程中,方便调用。程序如下:

----BBS 显示帖子分页----

$#@60; % Sub ShowList() %$#@62;

$#@60; %

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 "$#@60; P$#@62;$#@60; center$#@62;对不起,数据库中没有相关信息!$#@60; /center$#@62;$#@60; /P$#@62;"

else

RS.PageSize = Cint(PgSz) 设定PageSize属性的值

Total=INT(RS.recordcount / PgSz * -1)*-1 计算可显示页面的总数

PageNo=Request("pageno")

if PageNo="" Then

PageNo = 1

else

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 $#@60; 1 Then

PageNo = 1

end if

n=1

RS.AbsolutePage = PageNo

Response.Write "$#@60; CENTER$#@62;"

position=RS.PageSize*PageNo

pagebegin=position-RS.PageSize+1

if position $#@60; RS.RecordCount then

pagend=position

else

pagend= RS.RecordCount

end if

Response.Write "$#@60; P$#@62;$#@60; font color=Navy$#@62;$#@60; B$#@62;数据库查询结果:$#@60; /B$#@62;"

Response.Write "(共有"&RS.RecordCount &"条符合条件的信息,显示"&pagebegin&"-"&pagend&")$#@60; /font$#@62;$#@60; /p$#@62;"

Response.Write "$#@60; TABLE WIDTH=600 BORDER=1 CELLPADDING=4 CELLSPACING=0 BGCOLOR=#FFFFFF$#@62;"

Response.Write "$#@60; TR BGCOLOR=#5FB5E2$#@62;$#@60; FONT SIZE=2$#@62;$#@60; TD$#@62;$#@60; B$#@62;主题$#@60; /B$#@62;$#@60; /TD$#@62;$#@60; TD$#@62;$#@60; B$#@62;用户$#@60; /B$#@62;$#@60; /TD$#@62;$#@60; TD$#@62;$#@60; B$#@62;Email$#@60; /B$#@62;$#@60; /TD$#@62;$#@60; TD$#@62;$#@60; B$#@62;发布日期$#@60; /B$#@62;$#@60; /TD$#@62;$#@60; /FONT$#@62;$#@60; TR BGCOLOR=#FFFFFF$#@62;"

Do while not (RS is nothing)

RowCount = RS.PageSize

Do While Not RS.EOF and rowcount $#@62; 0

If n=1 then

Response.Write "$#@60; TR BGCOLOR=#FFFFFF$#@62;"

ELSE

Response.Write "$#@60; TR BGCOLOR=#EEEEEE$#@62;"

End If

n=1-n %$#@62;

$#@60; TD$#@62;$#@60; span style="font-size:9pt"$#@62;$#@60; A href=view.asp?key=$#@60; % =RS("ID")%$#@62;$#@62;$#@60; % =RS("subject")%$#@62;$#@60; /A$#@62;$#@60; /span$#@62;$#@60; /td$#@62;

$#@60; TD$#@62;$#@60; span style="font-size:9pt"$#@62;$#@60; % =RS("name")%$#@62;$#@60; /A$#@62;$#@60; /span$#@62;$#@60; /td$#@62;

$#@60; TD$#@62;$#@60; span style="font-size:9pt"$#@62;$#@60; a href="mailto:$#@60; % =RS("email")%$#@62;"$#@62;$#@60; % =RS("email")%$#@62;$#@60; /a$#@62;$#@60; /span$#@62; $#@60; /TD$#@62;

$#@60; TD$#@62;$#@60; span style="font-size:9pt"$#@62;$#@60; % =RS("postdate")%$#@62;$#@60; /span$#@62; $#@60; /td$#@62;

$#@60; /TR$#@62;

$#@60; %

RowCount = RowCount - 1

RS.MoveNext

Loop

set RS = RS.NextRecordSet

Loop

Conn.Close

set rs = nothing

set Conn = nothing

%$#@62;

$#@60; /TABLE$#@62;

$#@60; FORM METHOD=GET ACTION="list.asp"$#@62;

$#@60; INPUT TYPE="HIDDEN" NAME="pageno" VALUE="$#@60; % =PageNo %$#@62;"$#@62;

$#@60; %

if PageNo $#@62; 1 Then

response.write "$#@60; INPUT TYPE=SUBMIT NAME=ScrollAction VALUE= 上一页 $#@62;"

end if

if RowCount = 0 and PageNo $#@60; $#@62;Total then

response.write "$#@60; INPUT TYPE=SUBMIT NAME=ScrollAction VALUE= 下一页 $#@62;"

end if

response.write "$#@60; /FORM$#@62;"

End if

%$#@62;

$#@60; % End Sub %$#@62;

相信大家都应该能完全读懂上面的程序,因此作者就不在此详细解释了。值得注意的是在这段程序中运用了一个小技巧 $#@60; INPUT TYPE="HIDDEN" NAME="pageno" VALUE="$#@60; % =PageNo %$#@62;"$#@62;,这是用来在每次调用该 ASP 文件时传递数据的“暗道”,由于我们需要在每次调用程序时传递代表当前页码的参数,可能大家会想到使用 session,但是从节省系统资源和通用性来讲,用这样一个隐藏的 form 来传递数据将会达到更好的效果。

好了,又到了说再见的时候了,如果你没完全看懂本篇中所列的程序,那你必须加把油,看一看 VbScript 的语法;如果你还有某些疑问,可以,我将尽力解答;如果你有什么更好的建议也千万要来信告诉我哦 :上海治疗阳痿医院编辑整理)

asp mysql分页_asp数据库编程:ADO 存取数据库时如何分页显示相关推荐

  1. [.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库

    此为文章备份,原文出处(我的网站)  [.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库 http://www.dotblogs.com.tw ...

  2. asp.net mysql 查询_asp.net 多条件查询数据库

    ASP.NET3.5--第一章ASP.NET介绍 第一章  ASP.NET介绍 当微软创建.NET,它不仅仅梦想未来--它还担忧当代web开发技术的困惑和限制.在你开始ASP.NET3.5以前,本书帮 ...

  3. asp mysql 查询_ASP基础教程:数据库查询语言(1)

    原定计划从本篇开始就要给大家介绍 ASP 内建的 ActiveX 组件,但是考虑到我们在往后的学习中将会接触到大量的数据库查询,因此作者临时决定花一到两篇的篇幅向大家简要介绍一些数据库查询语言的基本知 ...

  4. asp mysql 查询_ASP数据库查询语言(一)

    相信很多朋友都听说过SQL这 个名字,如果你是计算机方面的行家,SQL 的大名一定是如雷贯耳.那么 SQL 究竟是什么呢?SQL 一词实际上是 "Structured Query Langu ...

  5. asp mysql语法_ASP编程基本语法

    ASP编程基本语句(一) Access + asp编制网站是属于动态网站,是通过把要编制的内容写入数据库里,在通过读取数据库的内容显示出来,学习目的:学会数据库的基本操作.数据库的基本操作无非是:查询 ...

  6. ado.net mysql类_DbHelper通用的ADO.NET数据库访问帮助类

    001通用数据库访问帮助类DbHelper.cs 002// 文 件: DbHelper.cs 003// 作 者: yangdeyong 004// 时 间: 2012年4月10日 10:12:45 ...

  7. 数据库访问抽象层系列-1(介绍数据库编程接口及数据库访问抽象层概念)

    摘要 本人最近完成了一个封装数据库访问抽象层的项目.我们开发的数据库访问抽象层作为分布式集群基础平台的一个组件.可以支持不同数据库编程接口(OCI.mysql.ODBC.pgsql)等.本系列博客主要 ...

  8. java语言数据库编程_JAVA语言数据库编程实例详解

    本文主要向大家介绍了JAVA语言数据库编程实例详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. DOS命令登录MySQL数据库:mysql -h 127.0.0.1 -u root ...

  9. python3数据库编程_python3+PyQt5 数据库编程--增删改实例

    本文通过python3+pyqt5改写实现了python qt gui 编程变成15章的excise例子. #!/usr/bin/env python3 import os import sys fr ...

最新文章

  1. Android6.0 禁止自动同步网络时间
  2. 又掌握了一项新技能 - 断点调试 Gradle 插件
  3. python中def fun(a、b=200)_python 基础 函数
  4. MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】
  5. 第六次作业(C语言)
  6. coldfusion_我从ColdFusion迁移到Java开发
  7. BZOJ1876 [SDOI2009]SuperGCD 【高精 + GCD优化】
  8. 确定比赛名次(HDU-1285)
  9. MCMC:Gibbs 采样(matlab 实现)
  10. 【笔试/面试】—— 数学找规律题
  11. 莫言诺贝尔文学奖演讲全文:《讲故事的人》(推荐)
  12. Eclipse 快捷键
  13. 内网穿透之HTTP穿透
  14. 旋转跳跃加后空翻,波士顿动力机器人Atlas的“变态程度”又升级了
  15. 企业网站建设如何选择企业cms系统
  16. 二十五、PHP内核探索:常量的实现 ☞ 脱离C语言和数学讨论底层都是耍流氓
  17. Java 面向对象 习题2(基础篇)
  18. (转载)HCIA-GaussDB 华为认证数据库工程师
  19. 怎么彻底处理windows下遇到的广告流氓软件例如:双11天喵、霸业传奇、贪玩蓝约等
  20. 搭建DEM企业管理器

热门文章

  1. 为什么 NGINX 的 reload 命令不是热加载?
  2. 知识图谱从哪里来:实体关系抽取的现状与未来
  3. 讯雷.BT及电骡的概念及区别!
  4. mp4box的安装和使用
  5. 什么是Windows的注册表
  6. div 固定不动 另一个div 有滚动条,position: relative的用法
  7. 英国旅游--庄园酒店
  8. 谈谈游戏动画的一些基础知识
  9. 查看端口信息netstat,查看ip,连接端口
  10. 最新!2023年工程测量乙级测绘资质申请标准