数据库分页 如何实现Oracle数据库的分页显示
各位老铁们好,相信很多人对数据库分页都不是特别的了解,因此呢,今天就来为大家分享下关于数据库分页以及如何实现Oracle数据库的分页显示的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
结合MySQL数据库,如何实现分页功能
第一步:我们可以利用$_GET方法获取某一个参数的值,在用户点击上一页、下一页、首页或者末页时获取不同的动态参数
第二步:根据MySQL的limit关键字,对动态参数进行SQL语句拼接
将定义每页显示的数据条数,在limit第一个参数的位置中,根据地址栏参数的动态变化从而实现指定从第几条数据开始显示数据
如何实现Oracle数据库的分页显示
1.使用T_BASE_PROVINCE表作为测试演示使用
2.查询下总共数据量select count(*) from T_BASE_PROVINCE,在分页的时候,一般会显示总页数,需要先查询总数据量得到总页数,总页数=总量/每页显示记录数。
3.前面的测试数据初始化完成之后,查询前20条大概有什么样的数据。
4.含order by排序,多一层嵌套,因为order by在select之后执行,不在里面写的话可能会出现不是预期的排序结果。
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
#p#副标题#e#
PageNo=PageNo+1
PageNo=PageNo-1
end if
ScrollAction= Request("ScrollAction")
if ScrollAction="上一页" Then
PageNo=PageNo-1
end if
if ScrollAction="下一页" Then
PageNo=PageNo+1
end if
if PageNo
1 Then
PageNo= 1
end if
n=1
RS.AbsolutePage= PageNo
Response.Write" CENTER"
position=RS.PageSize*PageNo
pagebegin=position-RS.PageSize+1
if position
RS.RecordCount then
pagend=position
else
pagend= RS.RecordCount
end if
Response.Write" P font color=\'Navy\' B数据库查询结果:/B"
Response.Write"(共有"RS.RecordCount"条符合条件的信息,显示"pagebegin"-"pagend")/font/p"
Response.Write" TABLE WIDTH=600 BORDER=1 CELLPADDING=4 CELLSPACING=0 BGCOLOR=#FFFFFF"
Response.Write" 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=#FFFFFF"
Do while not(RS is nothing)
RowCount= RS.PageSize
Do While Not RS.EOF and rowcount 0
If n=1 then
Response.Write" TR BGCOLOR=#FFFFFF"
ELSE
Response.Write" TR BGCOLOR=#EEEEEE"
End If
n=1-n%
TD span style="font-size:9pt" A href=\'view.asp?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 rel="external nofollow" href="mailto:%=RS("email")%"%=RS("email")%/a/span/TD
TD span style="font-size:9pt"%=RS("postdate")%/span/td
/TR
%
RowCount= RowCount- 1
RS.MoveNext
Loop
set RS= RS.NextRecordSet
Loop
Conn.Close
set rs= nothing
set Conn= nothing
%
/TABLE
FORM METHOD=GET ACTION="list.asp"
INPUT TYPE="HIDDEN" NAME="pageno" VALUE="%=PageNo%"
%
if PageNo 1 Then
response.write" INPUT TYPE=SUBMIT NAME=\'ScrollAction\' VALUE=\'上一页 \'"
end if
if RowCount= 0 and PageNo
Total then
response.write" INPUT TYPE=SUBMIT NAME=\'ScrollAction\' VALUE=\'下一页 \'"
end if
response.write"/FORM"
End if
%
% End Sub%
相信大家都应该能完全读懂上面的程序,因此作者就不在此详细解释了。值得注意的是在这段程序中运用了一个小技巧
INPUT TYPE="HIDDEN" NAME="pageno" VALUE="%=PageNo%"
,这是用来在每次调用该 ASP文件时传递数据的“暗道”,由于我们需要在每次调用程序时传递代表当前页码的参数,可能大家会想到使用 session,但是从节省系统资源和通用性来讲,用这样一个隐藏的 form来传递数据将会达到更好的效果。#p#副标题#e#
关于数据库分页和如何实现Oracle数据库的分页显示的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。