利用ASP实现对表的分页浏览
类别: ASP教程
大家都知道,ASP有着强大的数据库操作能力,这与她能方便的调用ActiveX对象是密不可分的。下面我给大家介绍一种ASP利用ADO对象实现对数据库记录分页显示的方法。以下代码均在WIN98+PWS+MSACCESS环境下通过。
在这里我主要通过ADO对象集中的Recordset对象来实现各种数据库操作的。先介绍几个用于分页显示的Recordset属性。
PageSize:每页显示的记录数。
PageCount:根据用户设好的PageSize和表中的总记录数,系统自动算出总页数。
RecordCount:表中的总记录数。
AbsolutePage:表示当前页码。如将AbsolutePage属性设为3,则当前记录移至第3页第1条(也就是第31条)。
看到Recordset有了这几个属性后,相信大家也都觉得做一个分页显示的程序是很简单的。下面讲一下思路,所有实现这一功能的代码都放在 display.asp中,按执行的顺序分别是:打开数据库及表、读取用户要求的显示方式、设定好PageSize和AbsolutePage、将内容输出到浏览器、设定好导航条。以下是代码:
>%\'---------------------------打开数据库及表
set conn=server.createobject("ADODB.Connection")
filepath=server.mappath("abc.mdb") \'-------假设数据库文件是"abc.mdb"
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & filepath
set rs=server.createobject("ADODB.Recordset")
rs.open "main",conn,3,2 \'-------假设表的名字是"main"
%>
>%\'---------------------------读取用户要求的显示方式(通过参数传递)
line=cint(request("line"))
page=cint(request("page"))
%>
>%\'---------------------------按用户要求设定好显示方式
rs.PageSize=line
rs.AbsolutePage=page
%>
>%\'---------------------------显示内容%>
>table width="100%" border="1">
>tr>
>%for i=0 to rs.Fields.Count-1%>
>td>>%=rs.Fields(i).name%>>/td>
>%next%>
>/tr>>%\'-------以上部分显示表头,即字段名%>
>%for i=1 to rs.PageSize%>
>tr>
>%for j=0 to rs.Fields.Count-1%>
>td>>%=rs.Fields(j).value%>>/td>
>%next%>
>/tr>
>%rs.movenext%>
>%if rs.eof then exit for%>
>%next%>>%\'-------以上部分显示表的内容%>
>/table>
>%\'---------------------------导航条%>
>table width=100% >>tr>
>td>
>%if page>>1 then%>
>a href=display.asp?page=1&line=>%=line%>>第一页>/a>
>%else%>第一页>%end if%>
>/td>
>td>
>%if page>1 then%>
>a href=display.asp?page=>%=page-1%>&line=>%=line%>>前一页>/a>
>%else%>前一页>%end if%>
>/td>
>td>
>%if page>rs.PageCount then%>
>a href=display.asp?page=>%=page+1%>&line=>%=line%>>下一页
>%else%>下一页>%end if%>
>/td>
>td>
>%if page>>rs.PageCount then%>
>a href=display.asp?page=>%=rs.PageCount%>&line=>%=line%>>最后一页>/a>
>%else%>最后一页>%end if%>
>/td>>%\'-------以上四项都需要进行判断:如果在第一页就不提供“第一页”和“前一页”的链接
\'-------如果在最后一页就不提供“最后一页”和“后一页”的链接%>
>td>
>form method="POST" action="display.asp?line=>%=line%>">
请输入页码:>input type="text" name="page" size="3" value=">%=page%>">
>/form>
>/td>
>td>
>form method="POST" action="display.asp?page=>%=page%>">
请设定每页>input type="text" name="line" size="3" value=">%=line%>">行
>/form>
>/td>>%\'-------因为两个表单都只有一个表单域,所以没有提供发送按钮,直接打回车就行了%>
>td>
第>%=page%>页/总>%=rs.PageCount%>页
>/td>
>/tr>>/table>
这只是一个最基本的程序,没有进行优化处理,也还有一些bug,下面我们一起来使它更“完美”一些。
一.关于参数传递。假如表中有46条记录,然后我们在地址栏中敲入http.//localhost/display.asp?line=10& page=2(假设这是正确的路径)肯定浏览器将给我们显示第二页的十条记录。但是如果在地址栏中只敲入 http.//localhost/display.asp,浏览器却给我们一个出错信息。如何解决呢?我们必须在读取这些参数时加一个判断,如果参数是空的,就赋给它一个初值,以防出错。将“读取用户要求的显示方式”部分用以下代码代替:
>%
if request("page")>>"" then
page=cint(request("page"))
else
page=1 \'-------如果参数page为空,就给它赋值1
end if
if request("line")>>"" then
line=cint(request("line"))
else
line=10 \'-------如果参数line为空,就给它赋值10
end if
%>
二.参数的合理性问题。如果我们在地址栏中敲入http.//localhost/display.asp?line=20&page=4会出现什么情况呢?浏览器报错。因为表中只有46条记录,而我们要它以每页显示二十条,第四页的二十条记录,也就是第六十一条到第八十条记录。显然会出错。同样情况还会出现在导航条中,如果当前浏览器中显示的是以每页十条,第四页的内容,我们去设定它以每页二十条显示,同样也会出错。解决方法还是一样的,先判断一下参数的合理性,然后再设置显示方式。将“按用户要求设定好显示方式”部分用以下代码代替。
>%
if page>(rs.RecordCount-1)line+1 then
\'-------通过计算可知,最大页数=(总记录数-1)每页行数+1
response.write("error!") \'-------如果参数不合实际,输出"error!"
response.end \'-------终止程序
end if
rs.PageSize=line
rs.AbsolutePage=page
%>
三.验证表单域。导航条中的两个输入文本框输入的都必须是整数,否则也会出错。我们可以利用FrontPage的验证表单域功能开完成,这里就不多说了。
四.优化。到目前为止,这个程序还有一个缺点。在数据库的存取过程中,最花时间的要数是数据库的打开和Recordset对象的建立,而这个程序每次执行都会打开数据库及建立Recordset对象,极大的降低了效率,一旦访问量增大,这个程序也就是去了价值。解决的办法是:第一次执行程序时,打开数据库及建立Recordset对象,并将这些存在session中,下次执行时直接将session中的值返回就行了。用以下代码代替“打开数据库及表”部分。
>%
if not isobject(session("conn")) then
set conn=server.createobject("ADODB.Connection")
filepath=server.mappath("abc.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & filepath
set rs=server.createobject("ADODB.Recordset")
rs.open "main",conn,3,2
set session("conn")=conn
set session("rs")=rs
else
set conn=session("conn")
set rs=session("rs")
end if
%>
至此,一个比较“完美”的程序完成了。
在这里我主要通过ADO对象集中的Recordset对象来实现各种数据库操作的。先介绍几个用于分页显示的Recordset属性。
PageSize:每页显示的记录数。
PageCount:根据用户设好的PageSize和表中的总记录数,系统自动算出总页数。
RecordCount:表中的总记录数。
AbsolutePage:表示当前页码。如将AbsolutePage属性设为3,则当前记录移至第3页第1条(也就是第31条)。
看到Recordset有了这几个属性后,相信大家也都觉得做一个分页显示的程序是很简单的。下面讲一下思路,所有实现这一功能的代码都放在 display.asp中,按执行的顺序分别是:打开数据库及表、读取用户要求的显示方式、设定好PageSize和AbsolutePage、将内容输出到浏览器、设定好导航条。以下是代码:
>%\'---------------------------打开数据库及表
set conn=server.createobject("ADODB.Connection")
filepath=server.mappath("abc.mdb") \'-------假设数据库文件是"abc.mdb"
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & filepath
set rs=server.createobject("ADODB.Recordset")
rs.open "main",conn,3,2 \'-------假设表的名字是"main"
%>
>%\'---------------------------读取用户要求的显示方式(通过参数传递)
line=cint(request("line"))
page=cint(request("page"))
%>
>%\'---------------------------按用户要求设定好显示方式
rs.PageSize=line
rs.AbsolutePage=page
%>
>%\'---------------------------显示内容%>
>table width="100%" border="1">
>tr>
>%for i=0 to rs.Fields.Count-1%>
>td>>%=rs.Fields(i).name%>>/td>
>%next%>
>/tr>>%\'-------以上部分显示表头,即字段名%>
>%for i=1 to rs.PageSize%>
>tr>
>%for j=0 to rs.Fields.Count-1%>
>td>>%=rs.Fields(j).value%>>/td>
>%next%>
>/tr>
>%rs.movenext%>
>%if rs.eof then exit for%>
>%next%>>%\'-------以上部分显示表的内容%>
>/table>
>%\'---------------------------导航条%>
>table width=100% >>tr>
>td>
>%if page>>1 then%>
>a href=display.asp?page=1&line=>%=line%>>第一页>/a>
>%else%>第一页>%end if%>
>/td>
>td>
>%if page>1 then%>
>a href=display.asp?page=>%=page-1%>&line=>%=line%>>前一页>/a>
>%else%>前一页>%end if%>
>/td>
>td>
>%if page>rs.PageCount then%>
>a href=display.asp?page=>%=page+1%>&line=>%=line%>>下一页
>%else%>下一页>%end if%>
>/td>
>td>
>%if page>>rs.PageCount then%>
>a href=display.asp?page=>%=rs.PageCount%>&line=>%=line%>>最后一页>/a>
>%else%>最后一页>%end if%>
>/td>>%\'-------以上四项都需要进行判断:如果在第一页就不提供“第一页”和“前一页”的链接
\'-------如果在最后一页就不提供“最后一页”和“后一页”的链接%>
>td>
>form method="POST" action="display.asp?line=>%=line%>">
请输入页码:>input type="text" name="page" size="3" value=">%=page%>">
>/form>
>/td>
>td>
>form method="POST" action="display.asp?page=>%=page%>">
请设定每页>input type="text" name="line" size="3" value=">%=line%>">行
>/form>
>/td>>%\'-------因为两个表单都只有一个表单域,所以没有提供发送按钮,直接打回车就行了%>
>td>
第>%=page%>页/总>%=rs.PageCount%>页
>/td>
>/tr>>/table>
这只是一个最基本的程序,没有进行优化处理,也还有一些bug,下面我们一起来使它更“完美”一些。
一.关于参数传递。假如表中有46条记录,然后我们在地址栏中敲入http.//localhost/display.asp?line=10& page=2(假设这是正确的路径)肯定浏览器将给我们显示第二页的十条记录。但是如果在地址栏中只敲入 http.//localhost/display.asp,浏览器却给我们一个出错信息。如何解决呢?我们必须在读取这些参数时加一个判断,如果参数是空的,就赋给它一个初值,以防出错。将“读取用户要求的显示方式”部分用以下代码代替:
>%
if request("page")>>"" then
page=cint(request("page"))
else
page=1 \'-------如果参数page为空,就给它赋值1
end if
if request("line")>>"" then
line=cint(request("line"))
else
line=10 \'-------如果参数line为空,就给它赋值10
end if
%>
二.参数的合理性问题。如果我们在地址栏中敲入http.//localhost/display.asp?line=20&page=4会出现什么情况呢?浏览器报错。因为表中只有46条记录,而我们要它以每页显示二十条,第四页的二十条记录,也就是第六十一条到第八十条记录。显然会出错。同样情况还会出现在导航条中,如果当前浏览器中显示的是以每页十条,第四页的内容,我们去设定它以每页二十条显示,同样也会出错。解决方法还是一样的,先判断一下参数的合理性,然后再设置显示方式。将“按用户要求设定好显示方式”部分用以下代码代替。
>%
if page>(rs.RecordCount-1)line+1 then
\'-------通过计算可知,最大页数=(总记录数-1)每页行数+1
response.write("error!") \'-------如果参数不合实际,输出"error!"
response.end \'-------终止程序
end if
rs.PageSize=line
rs.AbsolutePage=page
%>
三.验证表单域。导航条中的两个输入文本框输入的都必须是整数,否则也会出错。我们可以利用FrontPage的验证表单域功能开完成,这里就不多说了。
四.优化。到目前为止,这个程序还有一个缺点。在数据库的存取过程中,最花时间的要数是数据库的打开和Recordset对象的建立,而这个程序每次执行都会打开数据库及建立Recordset对象,极大的降低了效率,一旦访问量增大,这个程序也就是去了价值。解决的办法是:第一次执行程序时,打开数据库及建立Recordset对象,并将这些存在session中,下次执行时直接将session中的值返回就行了。用以下代码代替“打开数据库及表”部分。
>%
if not isobject(session("conn")) then
set conn=server.createobject("ADODB.Connection")
filepath=server.mappath("abc.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & filepath
set rs=server.createobject("ADODB.Recordset")
rs.open "main",conn,3,2
set session("conn")=conn
set session("rs")=rs
else
set conn=session("conn")
set rs=session("rs")
end if
%>
至此,一个比较“完美”的程序完成了。
- 上一篇: RESPONSE 对象
- 下一篇: 保护你ASP页面的两种办法
-= 资 源 教 程 =-
文 章 搜 索