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