站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
建站程序
开发
服务器
办公软件
开发教程
服务器教程
软件使用教程
运营教程
热门电子书
WordPress教程
宝塔面板教程
CSS教程
Shopify教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
ADO 存取数据库时如何分页显示
”
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
什么是 [[ADO]] 存取数据库时的分页显示?如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多页显示,每页显示一定数目的帖子数,譬如 20 条。这就是数据库查询的分页显示,如果你还不明白,去看看 yahoo 等搜索引擎的查询结果就会明白了。 <br> 那么究竟如何才能做到将数据库的查询结果分页显示呢?其实方法有很多,但主要有两种: <br> 一、将数据库中所有符合查询条件的记录一次性的都读入 recordset 中,存放在内存中,然后通过 ADO Recordset 对象所提供的几个专门支持分页处理的属性: PageSize( 页大小 )、 PageCount( 页数目 ) 以及 AbsolutePage( 绝对页 ) 来管理分页处理。 <br> 二、根据客户的指示,每次分别从符合查询条件的记录中将规定数目的记录数读取出来并显示。 <br> 两者的主要差别在于前者是一次性将所有记录都读入内存然后再根据指示来依次做判断分析从而达到分页显示的效果,而后者是先根据指示做出判断并将规定数目的符合查询条件的记录读入内存,从而直接达到分页显示的功能。 <br> 我们可以很明显的感觉到,当数据库中的记录数达到上万或更多时,第一种方法的执行效率将明显低于第二种方法,因为当每一个客户查询页面时都要将所有符合条件的记 娣旁诜衿髂诖嬷校缓笤诮蟹忠车却恚绻庇谐? 100 个的客户在线查询,那么 ASP 应用程序的执行效率将大受影响。但是,当服务器上数据库的记录数以及同时在线的人数并不是很多时,两者在执行效率上是相差无几的,此时一般就采用第一种方法,因为第一种方法的 ASP 程序编写相对第二种方法要简单明了得多。<br> 在这里作者就以我们常见的 ASP BBS 程序为例,来给大家分析一下如何在 BBS 程序里实现分页显示功能,由于我们一般使用的 BBS 程序的数据库记录数和同时访问的人数都不会太多,所以以下程序实例是使用的先前所介绍的第一种分页显示方法。<br> 进行 ADO 存取数据库时的分页显示,其实就是对 Recordset 的记录进行操作。所以我们首先必须了解 Reordset 对象的属性和方法: <br> BOF 属性:目前指标指到 RecordSet 的第一笔。 <br> EOF 属性:目前指标指到 RecordSet 的最后一笔。 <br> Move 方法:移动指标到 RecordSet 中的某一条记录。 <br> AbsolutePage 属性:设定当前记录的位置是位于哪一页 AbsolutePosition 属性:目前指标在 RecordSet 中的位置。 <br> PageCount 属性:显示 Recordset 对象包括多少“页”的数据。 <br> PageSize 属性:显示 Recordset 对象每一页显示的记录数。 <br> RecordCount 属性:显示 Recordset 对象记录的总数。 <br> 下面让我们来详细认识一下这些重要的属性和方法 <br> 一、 BOF 与 EOF 属性 <br> 通常我们在 ASP 程序中编写代码来检验 BOF 与 EOF 属性,从而得知目前指标所指向的 RecordSet 的位置,使用 BOF 与 EOF 属性,可以得知一个 Recordset 对象是否包含有记录或者得知移动记录行是否已经超出该 Recordset 对象的范围。 <br> 如: $#@60; % if not rs.eof then ... %$#@62; <br> $#@60; % if not (rs.bof and rs.eof) %$#@62; <br> 若当前记录的位置是在一个 Recordset 对象第一行记录之前时, BOF 属性返回 true,反之则返回 false。 <br> 若当前记录的位置是在一个 Recordset 对象最后一行记录之后时, EOF 属性返回 true,反之则返回 false。 <br> BOF 与 EOF 都为 False:表示指标位于 RecordSet 的当中。 <br> BOF 为 True:目前指标指到 RecordSet 的第一笔记录。 EOF 为 True:目前指标指到 RecordSet 的最后一笔记录。 <br> BOF 与 EOF 都为 True:在 RecordSet 里没有任何记录。 <br> 二、 Move 方法 <br> 您可以用 Move 方法移动指标到 RecordSet 中的某一笔记录,语法如下: <br> rs.Move NumRecords,Start <br> 这里的“rs”为一个对象变量,表示一个想要移动当当前记录位置的 Recordset 对象;“NumRecords”是一个正负数运算式,设定当前记录位置的移动数目;“start”是一个可选的项目,用来指定记录起始的标签。 <br> 所有的 Recordset 对象都支持 Move 方法,如果 NumRecords 参数大于零,当前记录位置向末尾的方向移动;如果其小于零,则当前记录位置向开头的方向移动;如果一个空的 Recordset 对象调用 Move 方法,将会产生一个错误。 <br> MoveFirst 方法:将当前记录位置移至第一笔记录。 <br> MoveLast 方法:将当前记录位置移至最后一笔记录。 <br> MoveNext 方法:将当前记录位置移至下一笔记录。 MovePrevious 方法:将当前记录位置移至上一笔记录。 <br> Move [n] 方法:移动指标到第 n 笔记录, n 由 0 算起。 <br> 三、 AbsolutePage 属性 <br> AbsolutePage 属性设定当前记录的位置是位于哪一页的页数编号;使用 PageSize 属性将 Recordset 对象分割为逻辑上的页数,每一页的记录数为 PageSize( 除了最后一页可能会有少于 PageSize 的记录数 )。这里必须注意并不是所有的数据提供者都支持此项属性,因此使用时要小心。 <br> 与 AbsolutePosition 属性相同, AbsolutePage 属性是以 1 为起始的,若当前记录为 Recordset 的第一行记录, AbsolutePage 为 1。可以设定 AbsolutePage 属性,以移动到一个指定页的第一行记录位置。 <br> 四、 AbsolutePosition 属性 <br> 若您需要确定目前指标在 RecordSet 中的位置,您可以用 AbsolutePosition 属性。 <br> AbsolutePosition 属性的数值为目前指标相对於第一笔的位置,由 1 算起,即第一笔的 AbsolutePosition 为 1。 <br> 注意 , 在存取 RecordSet 时,无法保证 RecordSet 每次都以同样的顺序出现。 <br> 若要启用 AbsolutePosition,必须先设定为使用用户端 cursor( 指针 ), asp 码如下: <br> rs2.CursorLocation = 3 <br> 五、 PageCount 属性 <br> 使用 PageCount 属性,决定 Recordset 对象包括多少“页”的数据。这里的“页”是数据记录的集合,大小等于 PageSize 属性的设定,即使最后一页的记录数比 PageSize 的值少,最后一页也算是 PageCount 的一页。必须注意也并不是所有的数据提供者都支持此项属性。 <br><br> 六、 PageSize 属性 <br> PageSize 属性是决定 ADO 存取数据库时如何分页显示的关键,使用它就可以决定多少记录组成一个逻辑上的“一页”。设定并建立一个页的大小,从而允许使用 AbsolutePage 属性移到其它逻辑页的第一条记录。 PageSize 属性能随时被设定。 <br> 七、 RecordCount 属性 <br> 这也是一个非常常用和重要的属性,我们常用 RecordCount 属性来找出一个 Recordset 对象包括多少条记录。如: $#@60; % totle=RS.RecordCount %$#@62; <br> 在了解了 Recordset 对象的以上属性和方法后,我们来考虑一下,如何运用它们来达到我们分页显示的目的。首先,我们可以为 PageSize 属性设置一个值,从而指定从记录组中取出的构成一个页的行数;然后通过 RecordCount 属性来确定记录的总数;再用记录总数除以 PageSize 就可得到所显示的页面总数;最后通过 AbsolutePage 属性就能完成对指定页的访问。好象很并不复杂呀,下面让我们来看看程序该如何实现呢?<br> 我们建立这样一个简单的 BBS 应用程序,它的数据库中分别有以下五个字段:“ID”,每个帖子的自动编号;“subject”,每个帖子的主题;“name”,加帖用户的姓名;“email”,用户的电子邮件地址;“postdate”,加帖的时间。数据库的 DSN 为“bbs”。我们将显示帖子分页的所有步骤放在一个名为“ShowList()”的过程中,方便调用。程序如下: <br> ----BBS 显示帖子分页----<br> $#@60; % Sub ShowList() %$#@62;<br> $#@60; %<br> PgSz=20 设定开关,指定每一页所显示的帖子数目,默认为20帖一页<br> Set Conn = Server.CreateObject("ADODB.Connection")<br> Set RS = Server.CreateObject("ADODB.RecordSet")<br><br> sql = "SELECT * FROM message order by ID DESC" <br>查询所有帖子,并按帖子的ID倒序排列<br> Conn.Open "bbs"<br> RS.open sql,Conn,1,1<br> If RS.RecordCount=0 then<br> response.write "$#@60; P$#@62;$#@60; center$#@62;对不起,数据库中没有相关信息!$#@60; /center$#@62;$#@60; /P$#@62;"<br> else<br> RS.PageSize = Cint(PgSz) 设定PageSize属性的值<br> Total=INT(RS.recordcount / PgSz * -1)*-1 计算可显示页面的总数<br> PageNo=Request("pageno")<br> if PageNo="" Then<br> PageNo = 1<br><br> else<br> PageNo=PageNo+1<br> PageNo=PageNo-1<br> end if<br> ScrollAction = Request("ScrollAction")<br> if ScrollAction = " 上一页 " Then<br> PageNo=PageNo-1<br> end if<br> if ScrollAction = " 下一页 " Then<br> PageNo=PageNo+1<br> end if<br> if PageNo $#@60; 1 Then <br> PageNo = 1<br> end if<br> n=1<br> RS.AbsolutePage = PageNo<br> Response.Write "$#@60; CENTER$#@62;"<br> position=RS.PageSize*PageNo<br> pagebegin=position-RS.PageSize+1<br> if position $#@60; RS.RecordCount then<br> pagend=position<br> else <br> pagend= RS.RecordCount<br> end if <br> Response.Write "$#@60; P$#@62;$#@60; font color=Navy$#@62;$#@60; B$#@62;数据库查询结果:$#@60; /B$#@62;"<br> Response.Write "(共有"&RS.RecordCount &"条符合条件的信息,显示"&pagebegin&"-"&pagend&")$#@60; /font$#@62;$#@60; /p$#@62;"<br> Response.Write "$#@60; TABLE WIDTH=600 BORDER=1 CELLPADDING=4 CELLSPACING=0 BGCOLOR=#FFFFFF$#@62;"<br> 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; <br>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; <br>B$#@62;发布日期$#@60; /B$#@62;$#@60; /TD$#@62;$#@60; /FONT$#@62;$#@60; TR BGCOLOR=#FFFFFF$#@62;"<br> Do while not (RS is nothing) <br><br> RowCount = RS.PageSize<br> Do While Not RS.EOF and rowcount $#@62; 0 <br> If n=1 then<br> Response.Write "$#@60; TR BGCOLOR=#FFFFFF$#@62;"<br> ELSE<br> Response.Write "$#@60; TR BGCOLOR=#EEEEEE$#@62;"<br> End If<br> n=1-n %$#@62;<br> $#@60; TD$#@62;$#@60; span style="font-size:9pt"$#@62;$#@60; A href=view.asp?key=$#@60; % =RS("ID")%$#@62;$#@62;$#@60; % =RS("subject")%<br>$#@62;$#@60; /A$#@62;$#@60; /span$#@62;$#@60; /td$#@62; <br> $#@60; TD$#@62;$#@60; span style="font-size:9pt"$#@62;$#@60; % =RS("name")%$#@62;$#@60; /A$#@62;$#@60; /span$#@62;$#@60; /td$#@62; <br> $#@60; TD$#@62;$#@60; span style="font-size:9pt"$#@62;$#@60; a href="mailto:$#@60; % =RS("email")%$#@62;"$#@62;$#@60; % =RS("email")%<br>$#@62;$#@60; /a$#@62;$#@60; /span$#@62; $#@60; /TD$#@62;<br> $#@60; TD$#@62;$#@60; span style="font-size:9pt"$#@62;$#@60; % =RS("postdate")%$#@62;$#@60; /span$#@62; $#@60; /td$#@62;<br> $#@60; /TR$#@62;<br> $#@60; %<br> RowCount = RowCount - 1<br> RS.MoveNext<br> Loop<br> set RS = RS.NextRecordSet<br> Loop<br> Conn.Close<br> set rs = nothing<br> set Conn = nothing<br> %$#@62;<br> $#@60; /TABLE$#@62;<br> $#@60; FORM METHOD=GET ACTION="list.asp"$#@62;<br> $#@60; INPUT TYPE="HIDDEN" NAME="pageno" VALUE="$#@60; % =PageNo %$#@62;"$#@62;<br> $#@60; % <br> if PageNo $#@62; 1 Then <br> response.write "$#@60; INPUT TYPE=SUBMIT NAME=ScrollAction VALUE= 上一页 $#@62;"<br> end if <br> if RowCount = 0 and PageNo $#@60; $#@62;Total then <br> response.write "$#@60; INPUT TYPE=SUBMIT NAME=ScrollAction VALUE= 下一页 $#@62;"<br> end if <br> response.write "$#@60; /FORM$#@62;"<br> End if<br> %$#@62;<br> $#@60; % End Sub %$#@62; <br> 相信大家都应该能完全读懂上面的程序,因此作者就不在此详细解释了。值得注意的是在这段程序中运用了一个小技巧 $#@60; INPUT TYPE="HIDDEN" NAME="pageno" VALUE="$#@60; % =PageNo %$#@62;"$#@62;,这是用来在每次调用该 ASP 文件时传递数据的“暗道”,由于我们需要在每次调用程序时传递代表当前页码的参数,可能大家会想到使用 session,但是从节省系统资源和通用性来讲,用这样一个隐藏的 form 来传递数据将会达到更好的效果。 <br> [[category:ASP]] [[category:PHP]] [[category:JSP]]
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)