艺术迷(fansart.com) 首页 收藏本站 RSS频道
艺术迷首页 -> 网页设计 -> 利用ASP实现对表的分页浏览
2006-3-2   作者:佚名   来源:
页面功能: 【评论】有错就点】 【字体: 】 【打印】 【关闭【收藏本页】
 利用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= 10page=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=20page=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 
%> 
网友评论
发表评论
您的姓名: 匿名发送
电子邮件:
评论内容:
不能超过100个字符



所有留言只代表网友个人观点,不代表本站观点。
请各位遵纪守法并注意语言文明。
新闻搜索
关 键 词:
搜索范围:
全站精华
图文精彩
清风楼书(一)[图]--平面广告
【2006-3-29 10:52:08】
清风楼书(一)
古典楼书(精品欣赏)(1)[图]--平面广告
【2006-4-5 15:03:08】
古典楼书(精品欣赏)(1)
美国插画师kevindart作品(1)[图]--CG插画
【2006-4-11 15:34:43】
美国插画师kevindart作品(1)
美国插画师kevindart作品[图]--CG插画
【2006-4-11 15:37:32】
美国插画师kevindart作品
荷兰著名画家Anton
【2006-4-11 15:49:41】
荷兰著名画家Anton Pieck插画
非常可爱的儿童插画(1)[图]--CG插画
【2006-4-11 15:59:16】
非常可爱的儿童插画(1)
回忆紫禁城里那些逝去的[图]--中国艺术
【2006-4-11 16:34:31】
回忆紫禁城里那些逝去的
国粹京剧脸谱表情[图]--界面设计
【2006-4-11 17:51:33】
国粹京剧脸谱表情
高傲的玫瑰-温碧霞[图]--摄影艺术
【2006-4-12 8:58:34】
高傲的玫瑰-温碧霞
北邦插画欣赏(1)[图]--CG插画
【2006-4-13 9:49:02】
北邦插画欣赏(1)
yashasi插画作品欣赏[图]--CG插画
【2006-4-13 18:32:29】
yashasi插画作品欣赏
cg插画欣赏[图]--CG插画
【2006-4-14 9:21:18】
cg插画欣赏
溯源居广告欣赏--小红人[图]--平面广告
【2006-4-14 14:45:57】
溯源居广告欣赏--小红人
泊林花园推广故事绘本(1)[图]--CG插画
【2006-4-20 11:34:33】
泊林花园推广故事绘本(1)
泊林花园推广故事绘本(2)[图]--CG插画
【2006-4-20 11:43:23】
泊林花园推广故事绘本(2)
万科西山庭院.格.沉.尊[图]--平面广告
【2006-4-21 9:08:35】
万科西山庭院.格.沉.尊
水木清华地产广告欣赏[图]--平面广告
【2006-4-26 9:31:54】
水木清华地产广告欣赏