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

  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>< B>Email< /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 来传递数据将会达到更好的效果。

  好了,又到了说再见的时候了,如果你没完全看懂本篇中所列的程序,那你必须加把油,看一看 VbScript 的语法;

时间: 2024-10-13 05:10:27

ASP基础教程:ADO存取数据库时如何分页显示的相关文章

asp数据库编程:ADO 存取数据库时如何分页显示

∈裁词?ADO 存取数据库时的分页显示?如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多页显示,每页显示一定数目的帖子数,譬如 20 条.想不想了解如何实现分页显示?请看本文! <动态网站设计十八般武艺 --ASP 篇>一文从第一期至今已和朋友们一起度过了大半个年头,相信通过在这一段时间中的学习.实践到再学习.再实践,大家已经能够熟练运用 ASP 的内建对象. ActiveX 组件去编写

ASP基础教程:堵住ASP漏洞

无论你相不相信,通过 asp,可能可以很方便地入侵 web server.窃取服务器上的文件.捕获 web 数据库等系统的用户口令,甚至恶意删除服务器上的的文件,直至造成系统损坏,这些都决非耸人听闻,而且都确确实实发生过,本文将向你一一揭示这些 asp 存在的漏洞,并提出一些防范意见. 上一篇中给大家着重谈了“ADO 存取数据库时如何分页显示”的问题,有位朋友来信给我指出我在计算页面总数时忽略了 Recordset 对象的一个重要参数“PageCount”,它能在给 Pagesize 赋值后自动

最完整的网狐棋牌-新手零基础教程 第三节 数据库的安装教程

最完整的网狐棋牌-新手零基础教程 第三节 数据库的安装教程 百度云在线播放地址: 本帖隐藏的内容 链接:http://pan.baidu.com/s/1qYHMIPu 密码:vpw3 解压密码:www.ttkmwl.com ----------------------------------------------------------------- 通天源码论坛官方QQ群: 官方一群: 147949983 官方二群: 536016771 通天源码论坛!专注源码分享,本论坛不仅有web源码,还

ASP基础教程:ActiveX 组件

当你用 ASP 编写服务器端应用程序时,必须依靠 ActiveX 组件来强大 Web 应用程序的功能,譬如:你需要连接数据库,对数据库进行在线操作等等,本文从本篇开始将陆续给大家介绍 ASP ActiveX 组件的使用方法. 从今天开始我们将正式学习 ASP 的精华部分 --ActiveX 组件.事实上,当你用 ASP 编写服务器端应用程序时,必须依靠 ActiveX 组件来强大 Web 应用程序的功能,譬如:你需要连接数据库,对数据库进行在线操作或者对 WEB 服务器上的文件系统进行操作,亦或

ASP基础教程:ASP简介

看了<如何令你的网站“动感十足”>一文后,是否令你怦然心动?是否已经急不可待地想构建属于你自己的动态网站?本文将以 Active Server Pages 为中心,向你全面展示制作动态商业网站的步骤和技巧并通过大量的实例,让你在不断的理论和实践之中笑傲“网络”…… 上一章给大家简要介绍了建立动态网站的一些方法和制作工具,本章将以如何建立基于 IIS 的 ASP 动态网站为中心向大家一步一步地揭示动态商业网站设计的真正奥秘.为了使各位能够全面.细致地掌握 ASP 的开发技巧,本文今后将采取连载的

ASP基础教程:数据库查询语言(2)

在本篇的开头,我要感谢一些朋友来信给我指出了前几篇文章中的错误.不知大家是否记得在第八篇中我举了一个简单的利用 Application 制作的页面访问计数器?有位朋友来信问我,为何当他改变计数器起始变量 NumVisits 的值后对最后的记数结果没有任何作用?起初我也大惑不解,让我们来回忆一下这段源程序,如下: < % Dim NumVisits NumVisits=0 Application.Lock Application("NumVisits") = Application

ASP基础教程:ASP脚本变量、函数、过程和条件语句

在上一期中作者向诸位简要介绍了 ASP 脚本语言之一 VBScript 的一些基本常识,本期将继续给大家讲解 VBScript 的脚本编写方法,并通过展示 VBScript 在 ASP 程序编写过程中的一系列实例使大家对 VBScript 有更进一层的理解. 大家在学习了脚本语言 VBScript 的变量.常量和过程的基本概念后,本期将继续向各位介绍 VBScript 的函数和语法. 函数和过程一样都是命名了的代码块,但它们却有很大的区别,过程完成程序任务,函数则返回值.我们可以这样理解,过程象

ASP基础教程:ASP内建对象Response

在上一篇中作者给大家详细介绍了 ASP 内建对象之一 Request 的使用方法,相信各位通过一系列的实践已经能够熟练掌握,本篇将继续给大家介绍 ASP 的另一个内建对象 Response. 最近,有很多朋友来“妹儿”催我加快 ASP 篇一文的写作速度,并急切地询问哪里有关于 ASP 的教材.我深深地被大家的学习热情所打动,因此决定将自己平时所搜集的一些 ASP 信息资料拿出来和大家共享,也希望所有的朋友能慷慨地将自己搜集的有关 ASP 的资料告诉作者,谢谢.由于目前国内有关 ASP 的中文教材

ASP基础教程:ASP脚本基础

通过前两篇的学习,相信各位已经对 ASP 的动态网站设计有了一个基本的概念和整体的印象.从本篇开始作者将从脚本语言的使用着手,由浅入深地带领大家探索 ASP 动态网站设计的真正奥秘. 本文第二篇刊登后,很多朋友给我发了“妹儿”,希望能尽快看到本文的第三.第四.乃至第……篇,甚至有位朋友焦急地要我将 ASP 篇的全文发给他.看到有如此之多志同道合的朋友,令我精神大振.虽然 ASP 早在两年前就已经推出了,但直到今年它才以其灵活便捷的开发过程.良好的 WEB 数据库连接功能受到了国人的重视,然而由于