打印

[数据库] ASP分页函数---原创

今天我写了个分页函数(ASP+ACCESS),之前在网上搜了下,很多,但是好多都是一大堆的代码,有的的确很强大,杀鸡焉用宰牛刀,所以自己写了个,代码没几行,但是速度也很快。一百万条数据,页面执行时间也就几十毫秒。
我写的这个函数,显示效果有两种。第一种就是5页内,页码左右有“上一页”和“下一页”;第二种是超过5页,页码左右是“前5页”和“后5页”。效果图如下图:


pagination.inc
复制内容到剪贴板
代码:
<%
Function pagination(pagecount)
dim myPage,myPageCount,PageNum
    if Len(Request.QueryString("page"))<>0 then
        myPage = clng(Request.QueryString("page"))
    else
        myPage =1
    End if
    if myPage <= 0 then myPage =1
    PageNum = (myPage \ 5)*5+1
    if myPage mod 5 = 0 then PageNum = (myPage \ 5)*5-4
    if myPage <= pagecount then
        if myPage > 5 then
            Response.Write ("<a href=""?page=1"">首页</a>")
            Response.Write ("&nbsp;<a href=""?page="& PageNum-1 &""">前5页</a>")
        elseif myPage > 1 and pagecount <= 5 then
            Response.Write ("<a href=""?page="& myPage-1 &""">上一页</a>")
        End if
        for PageNum = PageNum To PageNum + 4
            if PageNum = myPage then
                Response.Write ("&nbsp;<strong>["& PageNum &"]</strong>")
            else
                Response.Write ("&nbsp;<a href=""?page="& PageNum &""">")
                Response.Write ("["& PageNum &"]")
                Response.Write ("</a>")
            End if
            if PageNum >= pagecount then Exit for
        Next
    End if
    if myPage <= (pagecount - (pagecount mod 5)) and pagecount > 5  then
        Response.Write ("&nbsp;<a href=""?page="& PageNum &""">后5页</a>")
        Response.Write ("&nbsp;<a href=""?page="& pagecount &""">末页</a>")
    elseif myPage < pagecount and pagecount <= 5 then
        Response.Write ("&nbsp;<a href=""?page="& myPage+1 &""">下一页</a>")
    End if
End Function
%>
Pagination.asp
复制内容到剪贴板
代码:
<%
//ASP分页函数
//===============================================
//版权所有 (C) 2008 wo_is神仙,并保留所有权利。
//-----------------------------------------------
//请保留此段代码,它不会影响网站运行速度
//-----------------------------------------------
//Author:wo_is神仙
//Date:2008-3-20 13:42:48 +0800 星期四
//===============================================
dim startime,endtime
startime=timer()
%>
<!--#include file="conn.inc"-->
<!--#include file="pagination.inc"-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>分页</title>
<link href="pagination.css" rel="stylesheet" type="text/css" media="screen" />
</head>
<body>
<%dim myPageSize,rsCount,myPageCount,myPage
myPageSize = 20
rsCount = conn.execute ("select count(id) from test",0,1)(0)
myPageCount = abs(int(-abs(rsCount/myPageSize)))
myPage = clng(Request.QueryString("page"))
if len(myPage) = 0 or myPage = 0 then myPage = 1
%>
<table width="780" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
  <tr bgcolor="#FFFFFF">
    <td height="25" align="center">ID</td>
    <td align="center">标题</td>
    <td align="center">内容</td>
    <td align="center">时间</td>
  </tr>
<%set rs = Server.CreateObject("adodb.recordset")
rs.Open "select * from test order by id desc",conn,1,1
if rs.EOF or rs.BOF then%>
  <tr>
    <td height="25" colspan="4" align="center" bgcolor="#FFFFFF">暂无内容</td>
  </tr>
<%else
//根据分页参数获取当前页面纪录
rs.AbsolutePosition=rs.AbsolutePosition+((abs(myPage)-1)*myPageSize)
dim i,bgcolor
for i = 0 to myPageSize-1
    if rs.EOF then exit for
    bgColor="#FFFFFF"
    if i mod 2=0 then bgColor="#f1f1f1"
%>
  <tr bgcolor="<%=bgColor%>">
    <td height="25" align="center"><%=rs(0)%></td>
    <td align="center"><%=rs(1)%></td>
    <td align="center"><%=rs(2)%></td>
    <td align="center"><%=rs(3)%></td>
  </tr>
<%
rs.MoveNext
next
End if
rs.Close
set rs = nothing
%>
</table>
<table width="780" border="0" align="center" cellpadding="0" cellspacing="5">
  <tr>
    <td width="30%" height="25"><%="共" & rsCount & "条&nbsp;&nbsp;" & myPageSize & "条/页&nbsp;&nbsp;共" & myPageCount & "页"%></td>
    <td width="70%" height="25" align="right"><%=pagination(myPageCount)%></td>
  </tr>
  <tr>
    <td height="25" colspan="2" align="center">
    <%endtime=timer()%>
    本页面执行时间:<%=formatnumber((Endtime-startime)*1000,3)%>毫秒</td>
  </tr>
</table>
</body>
</html>
<%closeconn()%>
测试数据(一百万条数据)太大,传不上来,下载地址:http://jsw0528.b77.53dns.com/test.rar

[ 本帖最后由 jsw0528 于 2008-3-24 15:50 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
承接ASP定制,http://08-if.cn/
1、并非类,只是函数
2、超过5页时当前并非居中
3、速度快慢跟分页函数无关~
………………
4、大致是毛虫分页
乐于助人、严格管理、言多必失。无知者无罪。Keep your waiting,I am come back.
编程资源:http://book.kuhanzhu.com
对管理有异议,请前往事物区进行投诉。请勿PM。
呵呵.我的分页类还在Beta2上....

好久没更新了.在找毛病呢...
http://Reallydo.Com 承接ASP程序各种定做修改服务。
引用:
原帖由 kuhanzhu 于 2008-3-24 03:34 PM 发表
1、并非类,只是函数
2、超过5页时当前并非居中
3、速度快慢跟分页函数无关~
………………
4、大致是毛虫分页
回复:
1、标题手误,正文写的是“函数”
2、“超过5页时当前并非居中”,不解,你指的居中是什么?
3、也对,如果把rsCount = conn.execute ("select count(id) from test",0,1)(0)换成rsCount = rs.RecordCount,也可以实现,但是速度就慢了,这个应该是读取数据的问题
4、不管,支持原创(因为不是软件或者碟片,不然本人绝对支持盗版^_^)
承接ASP定制,http://08-if.cn/

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
第11页的时候

显示

首页 前5页 [9] [10] [11] [12] [13]

比较好吧.
http://Reallydo.Com 承接ASP程序各种定做修改服务。

TOP

引用:
原帖由 playboy2925 于 2008-3-24 03:49 PM 发表
第11页的时候

显示

首页 前5页 [9] [10] [11] [12] [13]

比较好吧.
萝卜青菜,各有所爱,呵呵
承接ASP定制,http://08-if.cn/

TOP

总数据从系统表(指程序设定的一个表)里读取更好,存数据时,专门用一个字段记录数据数。或者将总记录数缓存或者到cookies中。可以参考一些已有的分页程序,比如叶子分页等
分页函数是指:pagination.inc文件的函数
乐于助人、严格管理、言多必失。无知者无罪。Keep your waiting,I am come back.
编程资源:http://book.kuhanzhu.com
对管理有异议,请前往事物区进行投诉。请勿PM。

TOP

各位请教一下的.

关于这个分页确实好用的,但能不能添加点功能进去的.就是做个选定:指定那一页,然后按确实按钮,就跳到那一页去的.有没办法的呢.我想了好久想不出!!

TOP

引用:
原帖由 kuhanzhu 于 2008-3-24 15:56 发表
总数据从系统表(指程序设定的一个表)里读取更好,存数据时,专门用一个字段记录数据数。
分页函数是指:pagination.inc文件的函数
2、超过5页时当前并非居中

他的意思是(你看BAIDU)当点第5页的时候,前5页没消失,同时在后边又出现6-10页,当点第10页的时候雷同。。。

TOP

回复 假鸟 在 10# 的帖子

1、引用内容错误。应该引用2楼的内容
2、“超过5页时当前并非居中”这句话是我对楼主的代码说的。
乐于助人、严格管理、言多必失。无知者无罪。Keep your waiting,I am come back.
编程资源:http://book.kuhanzhu.com
对管理有异议,请前往事物区进行投诉。请勿PM。

TOP

个人意见

myPageSize = 20
rsCount = conn.execute ("select count(id) from test",0,1)(0)
myPageCount = abs(int(-abs(rsCount/myPageSize)))
myPage = clng(Request.QueryString("page"))

为何不就用
rs.pagesize = 20
myPageSize = rs.pagesize
rsCount = rs.recordcount
myPageCount = rs.pagecount

TOP

分页只是一算法.. 关键是你提取数据库内容的数据, 把当前页和总页数传入分页函数中就可以了.


如果你读取的数据内容快, 分页自然就快..  读取的内容慢分页自然就慢...

TOP

修正了一写BUG,详见:

http://home.blueidea.com/space.p ... do=blog&id=7014

解压密码:blueidea

[ 本帖最后由 kuhanzhu 于 2008-9-9 17:43 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
承接ASP定制,http://08-if.cn/

TOP

由于 jsw0528 的隐私设置,你不能访问当前内容
http://Reallydo.Com 承接ASP程序各种定做修改服务。

TOP

这个...,看完了,就只是知道“select * ...”,然后Absolute定位,其他的......
俺的同学,初学 asp/jsp,都是这样做的

贴上一段俺初学jsp时候做的取数据代码,类 PhonePageBean 省略
复制内容到剪贴板
代码:
public Vector getData(String sql, PhonePageBean pageBean) {
        Vector data = new Vector();
        conn = new DbConn().getConnDB();
        Statement stmt = null;
        ResultSet rs = null;
        try {
            stmt = conn.createStatement(1004, 1007);
            rs = stmt.executeQuery(sql);
            rs.absolute( (pageBean.getCurPage() - 1) * pageBean.getRowsPerPage() + 1);
            while (!rs.isAfterLast()) {
                Object[] obj = new Object[11];
                obj[0] = rs.getInt("pid");
                obj[1] = rs.getString("pname");
                obj[2] = rs.getString("bname");
                obj[3] = rs.getString("mood");
                obj[4] = rs.getDate("joindate");
                obj[5] = rs.getInt("clickcount");
                obj[6] = rs.getString("description");
                obj[7] = rs.getInt("price");
                obj[8] = rs.getInt("vouch");
                obj[9] = rs.getString("pimage");
                data.add(obj);
                rs.next();
            }
        }
        catch (SQLException ex) {
            ex.printStackTrace();
        }
        finally {
            try {
                rs.close();
                stmt.close();
                conn.close();
            }
            catch (SQLException ex1) {
            }
        }
        return data;
    }

TOP

我觉得楼主的办法在真正有100w条数据的网站根本不可行. 虽然楼主说100w数据检索只要几十ms,但楼主有没有试过如果表中有字段是text类型的,而且有数据?我在实际中发现如果表中有text字段的时候,用select title from table 比select * from table要快很多倍.所以分页慢的主要原因其实在sql语句的执行上,只要优化sql查询,其他函数和显示都是小意思了.

像我的网站, 如果是检索标题和标签的,sql语句中就不加内容字段,只有全文检索的时候才加.这样速度可以快很多.

我喜欢叶子分页,很快很强大!

[ 本帖最后由 max0960 于 2008-9-10 06:03 编辑 ]

TOP

复制内容到剪贴板
代码:
rs.AbsolutePosition=rs.AbsolutePosition+((abs(myPage)-1)*myPageSize)
楼主确定您实际测试过?
你风流,我俊雅,和你同年少,两情深,罚下愿,再不去跳槽。

TOP