asp 知识从入门到精通,看完你就是网络编程高手_第1页
asp 知识从入门到精通,看完你就是网络编程高手_第2页
asp 知识从入门到精通,看完你就是网络编程高手_第3页
asp 知识从入门到精通,看完你就是网络编程高手_第4页
asp 知识从入门到精通,看完你就是网络编程高手_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、 功力正不断地提升。最近很多朋友来信希望我写一些 ASP 在现实运用中的实例。因此,从本期开场我决定将?动态网站设计十八般武艺 -ASP 篇?的定位从介绍和学习 ASP 根基知识转向到 ASP 实际运行的探讨和深化。应朋友们的要求,在本期中我将给大家着重谈一谈“ADO 存取数据库时若何分页显示的问题。 什么是 ADO 存取数据库时的分页显示如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多页显示,每页显示一定数目的帖子数,譬如 20 条。这就是数据库查询的分页显示,如果你还不明白,去看看

3、yahoo 等搜索引擎的查询结果就会明白了。 那么终究若何才能做到将数据库的查询结果分页显示呢其实方法有很多,但主要有两种: 一、将数据库中所有符合查询条件的记录一次性的都读入 recordset 中,存放在内存中,然后通过 ADO Recordset 对象所提供的几个专门支持分页处理的属性: PageSize( 页大小 )、 PageCount( 页数目 ) 以及 AbsolutePage( 绝对页 ) 来管理分页处理。 二、根据客户的指示,每次分别从符合查询条件的记录中将规定数目的记录数读取出来并显示。 两者的主要差异在于前者是一次性将所有记录都读入内存然后再根据指示来依次做判断分析从而到

4、达分页显示的效果,而后者是先根据指示做出判断并将规定数目的符合查询条件的记录读入内存,从而直接到达分页显示的功能。 我们可以很明显的感觉到,当数据库中的记录数到达上万或更多时,第一种方法的执行效率将明显低于第二种方法,因为当每一个客户查询页面时都要将所有符合条件的记 娣旁诜衿髂诖嬷校缓笤诮蟹忠车却恚绻庇谐? 100 个的客户在线查询,那么 ASP 应用程序的执行效率将大受影响。但是,当服务器上数据库的记录数以及同时在线的人数并不是很多时,两者在执行效率上是相差无几的,此时一般就采用第一种方法,因为第一种方法的 ASP 程序编写相对第二种方法要简单明了得多。在这里作者就以我们常见的 ASP BB

5、S 程序为例,来给大家分析一下若何在 BBS 程序里实现分页显示功能,由于我们一般使用的 BBS 程序的数据库记录数和同时访问的人数都不会太多,所以以下程序实例是使用的先前所介绍的第一种分页显示方法。 进展 ADO 存取数据库时的分页显示,其实就是对 Recordset 的记录进展操作。所以我们首先必须了解 Reordset 对象的属性和方法: BOF 属性:目前指标指到 RecordSet 的第一笔。 EOF 属性:目前指标指到 RecordSet 的最后一笔。 Move 方法:移动指标到 RecordSet 中的某一条记录。 AbsolutePage 属性:设定当前记录的位置是位于哪一页

6、AbsolutePosition 属性:目前指标在 RecordSet 中的位置。 PageCount 属性:显示 Recordset 对象包括多少“页的数据。 PageSize 属性:显示 Recordset 对象每一页显示的记录数。 RecordCount 属性:显示 Recordset 对象记录的总数。 下面让我们来详细认识一下这些重要的属性和方法 一、 BOF 与 EOF 属性 通常我们在 ASP 程序中编写代码来检验 BOF 与 EOF 属性,从而得知目前指标所指向的 RecordSet 的位置,使用 BOF 与 EOF 属性,可以得知一个 Recordset 对象是否包含有记录或者

7、得知移动记录行是否已经超出该 Recordset 对象的范围。 如: $#60; % if not rs.eof then . %$#62; $#60; % if not (rs.bof and rs.eof) %$#62; 假设当前记录的位置是在一个 Recordset 对象第一行记录之前时, BOF 属性返回 true,反之那么返回 false。 假设当前记录的位置是在一个 Recordset 对象最后一行记录之后时, EOF 属性返回 true,反之那么返回 false。 BOF 与 EOF 都为 False:表示指标位于 RecordSet 的当中。 BOF 为 True:目前指标指到

8、 RecordSet 的第一笔记录。 EOF 为 True:目前指标指到 RecordSet 的最后一笔记录。 BOF 与 EOF 都为 True:在 RecordSet 里没有任何记录。 二、 Move 方法 您可以用 Move 方法移动指标到 RecordSet 中的某一笔记录,语法如下: rs.Move NumRecords,Start 这里的“rs为一个对象变量,表示一个想要移动当当前记录位置的 Recordset 对象;“NumRecords是一个正负数运算式,设定当前记录位置的移动数目;“start是一个可选的工程,用来指定记录起始的标签。 所有的 Recordset 对象都支持

9、Move 方法,如果 NumRecords 参数大于零,当前记录位置向末尾的方向移动;如果其小于零,那么当前记录位置向开头的方向移动;如果一个空的 Recordset 对象调用 Move 方法,将会产生一个错误。 MoveFirst 方法:将当前记录位置移至第一笔记录。 MoveLast 方法:将当前记录位置移至最后一笔记录。 MoveNext 方法:将当前记录位置移至下一笔记录。 MovePrevious 方法:将当前记录位置移至上一笔记录。 Move n 方法:移动指标到第 n 笔记录, n 由 0 算起。 三、 AbsolutePage 属性 AbsolutePage 属性设定当前记录的

10、位置是位于哪一页的页数编号;使用 PageSize 属性将 Recordset 对象分割为逻辑上的页数,每一页的记录数为 PageSize( 除了最后一页可能会有少于 PageSize 的记录数 )。这里必须注意并不是所有的数据提供者都支持此项属性,因此使用时要小心。 与 AbsolutePosition 属性一样, AbsolutePage 属性是以 1 为起始的,假设当前记录为 Recordset 的第一行记录, AbsolutePage 为 1。可以设定 AbsolutePage 属性,以移动到一个指定页的第一行记录位置。 四、 AbsolutePosition 属性 假设您需要确定目前

11、指标在 RecordSet 中的位置,您可以用 AbsolutePosition 属性。 AbsolutePosition 属性的数值为目前指标相对於第一笔的位置,由 1 算起,即第一笔的 AbsolutePosition 为 1。 注意 , 在存取 RecordSet 时,无法保证 RecordSet 每次都以同样的顺序出现。 假设要启用 AbsolutePosition,必须先设定为使用用户端 cursor( 指针 ), asp 码如下: rs2.CursorLocation = 3 五、 PageCount 属性 使用 PageCount 属性,决定 Recordset 对象包括多少“页

12、的数据。这里的“页是数据记录的集合,大小等于 PageSize 属性的设定,即使最后一页的记录数比 PageSize 的值少,最后一页也算是 PageCount 的一页。必须注意也并不是所有的数据提供者都支持此项属性。 六、 PageSize 属性 PageSize 属性是决定 ADO 存取数据库时若何分页显示的关键,使用它就可以决定多少记录组成一个逻辑上的“一页。设定并建设一个页的大小,从而允许使用 AbsolutePage 属性移到其它逻辑页的第一条记录。 PageSize 属性能随时被设定。 七、 RecordCount 属性 这也是一个非常常用和重要的属性,我们常用 RecordCou

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

14、BS 应用程序,它的数据库中分别有以下五个字段:“ID,每个帖子的自动编号;“subject,每个帖子的主题;“name,加帖用户的姓名;“email,用户的电子邮件地址;“postdate,加帖的时间。数据库的 DSN 为“bbs。我们将显示帖子分页的所有步骤放在一个名为“ShowList()的过程中,方便调用。程序如下: BBS 显示帖子分页$#60; % Sub ShowList() %$#62;$#60; %PgSz=20 设定开关,指定每一页所显示的帖子数目,默认为20帖一页Set Conn = Server.CreateObject(ADODB.Connection)Set RS

15、= Server.CreateObject(ADODB.RecordSet)sql = SELECT * FROM message order by ID DESC查询所有帖子,并按帖子的ID倒序排列Conn.Open bbsRS.open sql,Conn,1,1If RS.RecordCount=0 thenresponse.write $#60; P$#62;$#60; center$#62;对不起,数据库中没有相关信息!$#60; /center$#62;$#60; /P$#62;elseRS.PageSize = Cint(PgSz) 设定PageSize属性的值Total=INT(

16、RS.recordcount / 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 $#60; 1 Then PageNo = 1end ifn=1

17、RS.AbsolutePage = PageNoResponse.Write $#60; CENTER$#62;position=RS.PageSize*PageNopagebegin=position-RS.PageSize+1if position $#60; RS.RecordCount thenpagend=positionelse pagend= RS.RecordCountend if Response.Write $#60; P$#62;$#60; font color=Navy$#62;$#60; B$#62;数据库查询结果:$#60; /B$#62;Response.Writ

18、e (共有&RS.RecordCount &条符合条件的信息,显示&pagebegin&-&pagend&)$#60; /font$#62;$#60; /p$#62;Response.Write $#60; TABLE WIDTH=600 BORDER=1 CELLPADDING=4 CELLSPACING=0 BGCOLOR=#FFFFFF$#62;Response.Write $#60; TR BGCOLOR=#5FB5E2$#62;$#60; FONT SIZE=2$#62;$#60; TD$#62;$#60; B$#62;主题$#60; /B$#62;$#60; /TD$#62;$#6

19、0; 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; B$#62;发布日期$#60; /B$#62;$#60; /TD$#62;$#60; /FONT$#62;$#60; TR BGCOLOR=#FFFFFF$#62;Do while not (RS is nothing) RowCount = RS.PageSizeDo While Not RS.EOF and rowcount $#62; 0

20、 If n=1 thenResponse.Write $#60; TR BGCOLOR=#FFFFFF$#62;ELSEResponse.Write $#60; TR BGCOLOR=#EEEEEE$#62;End Ifn=1-n %$#62;$#60; TD$#62;$#60; span style=font-size:9pt$#62;$#60; A href=view.asp?key=$#60; % =RS(ID)%$#62;$#62;$#60; % =RS(subject)%$#62;$#60; /A$#62;$#60; /span$#62;$#60; /td$#62; $#60; TD

21、$#62;$#60; span style=font-size:9pt$#62;$#60; % =RS(name)%$#62;$#60; /A$#62;$#60; /span$#62;$#60; /td$#62; $#60; TD$#62;$#60; span style=font-size:9pt$#62;$#60; a href=mailto:$#60; % =RS(email)%$#62;$#62;$#60; % =RS(email)%$#62;$#60; /a$#62;$#60; /span$#62; $#60; /TD$#62;$#60; TD$#62;$#60; span style=font-size:9pt$#62;$#60; % =RS(postdate)%$#62;$#60; /span$#62; $#60; /td$#62;$#60; /TR$#62;$#60; %RowCount = RowCount - 1RS.MoveNextLoopset RS = RS.NextRecordSetLoopConn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论