分享
 
 
 

利用ASP实现对表的分页浏览

王朝asp·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

大家都知道,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

%>

至此,一个比较“完美”的程序完成了。各位大虾有何高见?欢迎来信与我探讨。webflier@263.net

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有