一个关于ADO访问数据库实现分页

ado|访问|分页|数据|数据库

什么是 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 对象的范围。

   如: < % 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”。我们将显示帖子分页的所有步骤放在一个名为“ShowL

时间: 2024-10-23 05:39:08

一个关于ADO访问数据库实现分页的相关文章

delphi 通过 ado 访问数据库存储过程,如果有插入动作,为什么会执行两遍?

问题描述 delphi 通过 ado 访问数据库存储过程,如果有插入动作,为什么会执行两遍? 20C 如题.这是我反复测试后得出的结论.我实在不理解为什么. 具体测试过程是这样子的:我用ado连接数据库.然后我写了一个简单的存储过程,就是往表里插入数据.然后我用ado调用这个存储过程.然后我就发现,虽然程序里我只调用了一次,但实际上表里的数据却被插入了完全一模一样的两条. 这算是bug还是怎么回事?是不是有什么我不曾注意到的细节没处理好? 存储过程代码如下: create procedure p

多线程-Delphi的ADO访问数据库的问题

问题描述 Delphi的ADO访问数据库的问题 问题一: 多线程并发时,每个线程使用自己的adoconnection连接oracle,然后各自执行自己的查询,会不会有优先级的问题? 问题二: sql语句在代码里通过ado查询和在plsql里查询,速度差异会很大吗? 解决方案 (1)不会有什么优先级的问题,在sql中,单条语句本身构成一个事务它是原子的.比如 update table set a = a + 1,这里a = a+1肯定是原子操作,不可能有并发问题. 但是,如果你的程序中有多条sql

实现一个移动端访问数据库的webservice接口的流程

问题描述 实现一个移动端访问数据库的webservice接口的流程,过程中要用到哪些东东,最好有实例... 解决方案 解决方案二:用C#这个语言解决方案三:提供一个例子:Android客户端调用C#WebService.http://blog.csdn.net/chinacsharper/article/details/38386779 解决方案四:没移动端部分,只有服务端部分解决方案五:这不就是webservice么..VS新建网站添加一个web服务写方法就搞定了啊..至于客户端(调用者)是c

通过ADO.NET访问数据库

ado|访问|数据|数据库 通过ADO.NET访问数据库 作者:不详  -------------------------------------------------------------------------------- ADO.NET访问数据库的步骤不论从语法来看,还是从风格和设计目标来看,ADO.NET都和ADO有显著的不同.在ASP中通过ADO访问数据库,一般要通过以下四个步骤:1. 创建一个到数据库的链路,即ADO.Connection:2. 查询一个数据集合,即执行SQL,

ADO.NET访问数据库的步骤

ado|访问|数据|数据库 不论从语法来看,还是从风格和设计目标来看,ADO.NET都和ADO有显著的不同.在ASP中通过ADO访问数据库,一般要通过以下四个步骤: 1.创建一个到数据库的链路,即ADO.Connection: 2.查询一个数据集合,即执行SQL,产生一个Recordset: 3.对数据集合进行需要的操作: 4.关闭数据链路. 在ADO.NET里,这些步骤有很大的变化.ADO.NET的最重要概念之一是DataSet.DataSet是不依赖于数据库的独立数据集合.所谓独立,就是:即

有关ADO访问不同数据库的差别详细介绍

ado|访问|数据|数据库 Microsoft公司提供了统一的数据访问接口ActiveX Data Object,简称ADO.但实际应用编程中,访问不同的数据库,如Access.SQL Server或VFP,会存在一些"细微"差别,常常有这样的情况,用ADO对象访问某一数据库的程序都调试通过了,但用同样的程序访问其他数据库就存在这样或那样的问题,反之也一样.这种差别就笔者来看好像没什么意义,因为都是一个公司的产品:虽然这种差别不多,但要搞清它的来龙去脉,足以使用户忙乎一阵子,a无端增加

如何使用ADO访问Oracle数据库存储过程

一.关于ADO 在基于Client/Server结构的数据库环境中,通过OLE DB接口可以存取数据,但它定义的是低层COM接口,不仅不易使用,而且不能被VB,VBA,VBScript等高级编程工具访问. 而使用ADO则可以很容易地使VB等编程语言直接访问数据(通过OLE DB接口).ADO是基于面向对象方法的,其对象模型如下图所示(略) 由上图可见,ADO对象模型总共才包括六个对象,相对于数据访问对象(DAO)来说简单得多.因此实际中常常使用它来访问数据库. 二.ADO访问数据库实例 下面,我

java web工程中一个dao只有一个实例访问数据库对性能的影响

问题描述 就是同一个dao实现只会实例化一个,每次访问数据库的时候都是用的同一个实例,这样对性能会不会有什么影响,不考虑线程安全. 解决方案 解决方案二:每一次访问都new了一个新的dao,对性能会不会有影响解决方案三:dao一般不会有带状态的成员变量不会引发线程安全问题.解决方案四:该回复于2010-05-15 14:14:18被版主删除

VC基于ADO技术访问数据库的方法_C 语言

本文实例讲述了VC基于ADO技术访问数据库的方法.分享给大家供大家参考.具体如下: 一.在StdAfx.h文件中添加 复制代码 代码如下: #import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("EOF","rsEOF") 导入ADO引擎. 二.数据库应用层操作 void CADOExample1Dlg::OnBtnQuery() {