您当前的位置: 首页 > 健康

BOF属性目前指标指到RecordSet

2018-11-05 09:06:29

09:20 来源:页教学 :阿小【纠错】人评论

A-A+ 怎么开淘宝店 站优化方法 创业如何获得投资 小米note顶配版评测 LOL活动

什么是 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 f then ... %

% if not (f and f) %

若当前记录的位置是在一个 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 中的某一笔记录,语法如下:

ve NumRecordsStart

这里的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 码如下:

rsorLocation = 3

五、PageCount 属性

使用 PageCount 属性,决定 Recordset 对象包括多少页的数据。这里的页是数据记录的集合,大小等于 PageSize 属性的设定,即使一页的记录数比 PageSize 的值少,一页也算是 PageCount 的一页。必须注意也并不是所有的数据提供者都支持此项属性。

六、PageSize 属性

PageSize 属性是决定 ADO 存取数据库时如何分页显示的关键,使用它就可以决定多少记录组成一个逻辑上的一页。设定并建立一个页的大小,从而允许使用 AbsolutePage 属性移到其它逻辑页的条记录。 PageSize 属性能随时被设定。

七、RecordCount 属性

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

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

以下为引用的内容:\'----BBS 显示帖子分页---- % Sub ShowList() % %PgSz=20 \'设定开关,指定每一页所显示的帖子数目,默认为20帖一页Set Conn = eateObject(nnection)Set RS = eateObject(cordSet)sql = SELECT * FROM message order by ID DESC\'查询所有帖子,并按帖子的ID倒序排列en en sqlConn11If cordCount=0 ite P center对不起,数据库中没有相关信息! /center /geSize = Cint(PgSz) \'设定PageSize属性的值Total=INT(cordcount / PgSz * -1)*-1 \'计算可显示页面的总数PageNo=Request(pageno)if PageNo= ThenPageNo = 1elsePageNo=PageNo+1PageNo=PageNo-1end ifScrollAction = Request(ScrollAction)if ScrollAction = 上一页 ThenPageNo=PageNo-1end ifif ScrollAction = 下一页 ThenPageNo=PageNo+1end ifif PageNo 1 ThenPageNo = 1end ifn=solutePage = ite CENTERposition=geSize*PageNopagebegin=geSize+1if position cordCount thenpagend=positionelsepagend= cordCountend ite P font color=\'Navy\' B数据库查询结果: /ite (共有cordCount 条符合条件的信息显示pagebegin-pagend) /font /ite TABLE WIDTH=600 BORDER=1 CELLPADDING=4 CELLSPACING=0 BGCOLOR=#ite 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=#FFFFFFDo while not (RS is nothing)RowCount = geSizeDo While Not F and rowcount 0If n=1 ite TR BGCOLOR=#ite TR BGCOLOR=#EEEEEEEnd Ifn=1-n % TD span style=font-size:9pt A href=\'p?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 - veNextLoopset RS = oseset rs = nothingset Conn = nothing% /TABLE FORM METHOD=GET ACTION=p INPUT TYPE=HIDDEN NAME=pageno VALUE= % =PageNo % %if PageNo 1 ite INPUT TYPE=SUBMIT NAME=\'ScrollAction\' VALUE=\' 上一页 \'end ifif RowCount = 0 and PageNo Total ite INPUT TYPE=SUBMIT NAME=\'ScrollAction\' VALUE=\' 下一页 \'end ite /FORMEnd if% % End Sub %

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

好了,又到了说再见的时候了,如果你没完全看懂本篇中所列的程序,那你必须加把油,看一看 VbScript 的语法;如果你还有某些疑问,可以妹儿我,我将尽力解答;如果你有什么更好的建议也千万要来信告诉我哦。

查看更多相似文章

矿井提升机
超纯水设备
树脂砂机床铸件
推荐阅读
图文聚焦