新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → [转帖]Access 2000 数据库 80 万记录通用快速分页类(ASP) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 3739 个阅读者  浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [转帖]Access 2000 数据库 80 万记录通用快速分页类(ASP) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客楼主
    发贴心情 [转帖]Access 2000 数据库 80 万记录通用快速分页类(ASP)

    作者:萧月痕(xiaoyuehen)
    地址:http://blog.csdn.net/xiaoyuehen/archive/2005/01/17/257202.aspx
    转贴请包含相关信息, 谢谢.

    主要思路: 用一条语句统计(Count)出记录数(而不在查询时获得 RecordCount 属性), 缓存在 Cookies 中, 跳转时就不用再次统计, 分页跳转链接也由此来, 使用 ADO 的 AbsolutePage 属性设置当前页面, 返回intPageSize 条记录. 为方便调用而写成类, 代码主要地方已有说明

    硬件环境: AMD Athlon XP 2600+, 256 DDR
    软件环境: MS Windows 2000 Advanced Server + IIS 5.0 + Access 2000 + IE 6.0
    测试结果: 初次运行在 250(首页) - 400(末页)毫秒, (记录数缓存后)在页面间跳转稳定在 47 毫秒以下.第1页跳到最后一页不多于 350 毫秒

    适用范围: 用于普通分页. 不适用于有较复杂的查询时: 如条件为"[Title] Like '%最爱%'", 查询的时间大大增加, 就算 Title 字段作了索引也没用. :(

    <%@LANGUAGE = "VBScript" CODEPAGE="936"%>
    <%Option Explicit%>
    <%
    Dim intDateStart
    intDateStart = Timer()
    Rem ## 打开数据库连接
    Rem #################################################################
    function f__OpenConn()
    Dim strDbPath
    Dim connstr
    strDbPath = "../db/test.mdb"
    connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    connstr = connstr & Server.MapPath(strDbPath)
    Set conn = Server.CreateObject("Adodb.Connection")
    conn.open connstr
    End function
    Rem #################################################################

    Rem ## 关闭数据库连接
    Rem #################################################################
    function f__CloseConn()
    If IsObject(conn) Then
    conn.close
    End If
    Set conn = nothing
    End function
    Rem #################################################################
    Rem 获得执行时间
    Rem #################################################################
    function getTimeOver(iflag)
    Dim tTimeOver
    If iflag = 1 Then
    tTimeOver = FormatNumber(Timer() - intDateStart, 6, true)
    getTimeOver = " 执行时间: " & tTimeOver & " 秒"
    Else
    tTimeOver = FormatNumber((Timer() - intDateStart) * 1000, 3, true)
    getTimeOver = " 执行时间: " & tTimeOver & " 毫秒"
    End If
    End function
    Rem #################################################################
    Class Cls_PageView
    Private sbooInitState
    Private sstrCookiesName
    Private sstrPageUrl
    Private sstrPageVar
    Private sstrTableName
    Private sstrFieldsList
    Private sstrCondiction
    Private sstrOrderList
    Private sstrPrimaryKey
    Private sintRefresh

    Private sintRecordCount
    Private sintPageSize
    Private sintPageNow
    Private sintPageMax

    Private sobjConn

    Private sstrPageInfo

    Private Sub Class_Initialize
    Call ClearVars()
    End Sub

    Private Sub class_terminate()
    Set sobjConn = nothing
    End Sub

    Public Sub ClearVars()
    sbooInitState = False
    sstrCookiesName = ""
    sstrPageUrl = ""
    sstrPageVar = "page"
    sstrTableName = ""
    sstrFieldsList = ""
    sstrCondiction = ""
    sstrOrderList = ""
    sstrPrimaryKey = ""
    sintRefresh = 0

    sintRecordCount = 0
    sintPageSize = 0
    sintPageNow = 0
    sintPageMax = 0
    End Sub

    Rem ## 保存记录数的 Cookies 变量
    Public Property Let strCookiesName(Value)
    sstrCookiesName = Value
    End Property

    Rem ## 转向地址
    Public Property Let strPageUrl(Value)
    sstrPageUrl = Value
    End Property

    Rem ## 表名
    Public Property Let strTableName(Value)
    sstrTableName = Value
    End Property

    Rem ## 字段列表
    Public Property Let strFieldsList(Value)
    sstrFieldsList = Value
    End Property

    Rem ## 查询条件
    Public Property Let strCondiction(Value)
    If Value <> "" Then
    sstrCondiction = " WHERE " & Value
    Else
    sstrCondiction = ""
    End If
    End Property

    Rem ## 排序字段, 如: [ID] ASC, [CreateDateTime] DESC
    Public Property Let strOrderList(Value)
    If Value <> "" Then
    sstrOrderList = " ORDER BY " & Value
    Else
    sstrOrderList = ""
    End If
    End Property

    Rem ## 用于统计记录数的字段
    Public Property Let strPrimaryKey(Value)
    sstrPrimaryKey = Value
    End Property

    Rem ## 每页显示的记录条数
    Public Property Let intPageSize(Value)
    sintPageSize = toNum(Value, 20)
    End Property

    Rem ## 数据库连接对象
    Public Property Let objConn(Value)
    Set sobjConn = Value
    End Property

    Rem ## 当前页
    Public Property Let intPageNow(Value)
    sintPageNow = toNum(Value, 1)
    End Property

    Rem ## 页面参数
    Public Property Let strPageVar(Value)
    sstrPageVar = Value
    End Property

    Rem ## 是否刷新. 1 为刷新, 其他值则不刷新
    Public Property Let intRefresh(Value)
    sintRefresh = toNum(Value, 0)
    End Property

    Rem ## 获得当前页
    Public Property Get intPageNow()
    intPageNow = singPageNow
    End Property

    Rem ## 分页信息
    Public Property Get strPageInfo()
    strPageInfo = sstrPageInfo
    End Property

    Rem ## 取得记录集, 二维数组或字串, 在进行循环输出时必须用 IsArray() 判断
    Public Property Get arrRecordInfo()
    If Not sbooInitState Then
    Exit Property
    End If

    Dim rs, sql
    sql = "SELECT " & sstrFieldsList & _
    " FROM " & sstrTableName & _
    sstrCondiction & _
    sstrOrderList

    Set rs = Server.CreateObject("Adodb.RecordSet")
    rs.open sql, sobjConn, 1, 1
    If Not(rs.eof or rs.bof) Then
    rs.PageSize = sintPageSize
    rs.AbsolutePage = sintPageNow
    If Not(rs.eof or rs.bof) Then
    arrRecordInfo = rs.getrows(sintPageSize)
    Else
    arrRecordInfo = ""
    End If
    Else
    arrRecordInfo = ""
    End If
    rs.close
    Set rs = nothing
    End Property

    Rem ## 初始化记录数
    Private Sub InitRecordCount()
    sintRecordCount = 0
    If Not(sbooInitState) Then Exit Sub
    Dim sintTmp
    sintTmp = toNum(request.Cookies("_xp_" & sstrCookiesName), -1)
    If ((sintTmp < 0) Or (sintRefresh = 1))Then
    Dim sql, rs
    sql = "SELECT COUNT(" & sstrPrimaryKey & ")" & _
    " FROM " & sstrTableName & _
    sstrCondiction
    Set rs = sobjConn.execute(sql)
    If rs.eof or rs.bof Then
    sintTmp = 0
    Else
    sintTmp = rs(0)
    End If
    sintRecordCount = sintTmp

    response.Cookies("_xp_" & sstrCookiesName) = sintTmp
    Else
    sintRecordCount = sintTmp
    End If
    End Sub

    Rem ## 初始化分页信息
    Private Sub InitPageInfo()
    sstrPageInfo = ""
    If Not(sbooInitState) Then Exit Sub

    Dim surl
    surl = sstrPageUrl
    If Instr(1, surl, "?", 1) > 0 Then
    surl = surl & "&" & sstrPageVar & "="
    Else
    surl = surl & "?" & sstrPageVar & "="
    End If

    If sintPageNow <= 0 Then sintPageNow = 1
    If sintRecordCount mod sintPageSize = 0 Then
    sintPageMax = sintRecordCount \ sintPageSize
    Else
    sintPageMax = sintRecordCount \ sintPageSize + 1
    End If
    If sintPageNow > sintPageMax Then sintPageNow = sintPageMax

    If sintPageNow <= 1 then
    sstrPageInfo = "首页 上一页"
    Else
    sstrPageInfo = sstrPageInfo & " <a href=""" & surl & "1"">首页</a>"
    sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow - 1) & """>上一页</a>"
    End If

    If sintPageMax - sintPageNow < 1 then
    sstrPageInfo = sstrPageInfo & " 下一页 末页 "
    Else
    sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow + 1) & """>下一页</a> "
    sstrPageInfo = sstrPageInfo & " <a href=""" & surl & sintPageMax & """>末页</a> "
    End If

    sstrPageInfo = sstrPageInfo & " 页次:<strong><font color=""#990000"">" & sintPageNow & "</font> / " & sintPageMax & " </strong>"
    sstrPageInfo = sstrPageInfo & " 共 <strong>" & sintRecordCount & "</strong> 条记录 <strong>" & sintPageSize & "</strong> 条/页 "
    End Sub

    Rem ## 长整数转换
    Private function toNum(s, Default)
    s = s & ""
    If s <> "" And IsNumeric(s) Then
    toNum = CLng(s)
    Else
    toNum = Default
    End If
    End function

    Rem ## 类初始化
    Public Sub InitClass()
    sbooInitState = True
    If Not(IsObject(sobjConn)) Then sbooInitState = False
    Call InitRecordCount()
    Call InitPageInfo()
    End Sub
    End Class
    Dim strLocalUrl
    strLocalUrl = request.ServerVariables("SCRIPT_NAME")

    Dim intPageNow
    intPageNow = request.QueryString("page")

    Dim intPageSize, strPageInfo
    intPageSize = 30

    Dim arrRecordInfo, i
    Dim Conn
    f__OpenConn
    Dim clsRecordInfo
    Set clsRecordInfo = New Cls_PageView

    clsRecordInfo.strTableName = "[myTable]"
    clsRecordInfo.strPageUrl = strLocalUrl
    clsRecordInfo.strFieldsList = "[ID], [Title], [LastTime]"
    clsRecordInfo.strCondiction = "[ID] < 10000"
    clsRecordInfo.strOrderList = "[ID] ASC"
    clsRecordInfo.strPrimaryKey = "[ID]"
    clsRecordInfo.intPageSize = 20
    clsRecordInfo.intPageNow = intPageNow

    clsRecordInfo.strCookiesName = "RecordCount"
    clsRecordInfo.strPageVar = "page"

    clsRecordInfo.intRefresh = 0
    clsRecordInfo.objConn = Conn
    clsRecordInfo.InitClass

    arrRecordInfo = clsRecordInfo.arrRecordInfo
    strPageInfo = clsRecordInfo.strPageInfo
    Set clsRecordInfo = nothing
    f__CloseConn
    %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>分页测试</title>
    <style type="text/css">
    <!--
    .PageView {
    font-size: 12px;
    }
    .PageView td {
    border-right-style: solid;
    border-bottom-style: solid;
    border-right-color: #E0E0E0;
    border-bottom-color: #E0E0E0;
    border-right-width: 1px;
    border-bottom-width: 1px;
    }
    .PageView table {
    border-left-style: solid;
    border-top-style: solid;
    border-left-color: #E0E0E0;
    border-top-color: #E0E0E0;
    border-top-width: 1px;
    border-left-width: 1px;
    }
    tr.Header {
    background: #EFF7FF;
    font-size: 14px;
    font-weight: bold;
    line-height: 120%;
    text-align: center;
    }
    -->
    </style>
    <style type="text/css">
    <!--
    body {
    font-size: 12px;
    }
    a:link {
    color: #993300;
    text-decoration: none;
    }
    a:visited {
    color: #003366;
    text-decoration: none;
    }
    a:hover {
    color: #0066CC;
    text-decoration: underline;
    }
    a:active {
    color: #000000;
    text-decoration: none;
    }
    table {
    font-size: 12px;
    }
    -->
    </style>
    </head>
    <body>
    <table width="100%" border="0" cellspacing="0" cellpadding="4">
    <tr>
    <td><%= strPageInfo%></td>
    </tr>
    </table>
    <div class="PageView">
    <table width="100%" border="0" cellspacing="0" cellpadding="4">
    <tr class="Header">
    <td>ID</td>
    <td>描述</td>
    <td>日期</td>
    </tr>
    <%
    If IsArray(arrRecordInfo) Then
    For i = 0 to UBound(arrRecordInfo, 2)
    %>
    <tr>
    <td><%= arrRecordInfo(0, i)%></td>
    <td><%= arrRecordInfo(1, i)%></td>
    <td><%= arrRecordInfo(2, i)%></td>
    </tr>
    <%
    Next
    End If
    %>
    </table>
    </div>
    <table width="100%" border="0" cellspacing="0" cellpadding="4">
    <tr>
    <td><%= strPageInfo%></td>
    </tr>
    </table>
    <table width="100%" border="0" cellspacing="0" cellpadding="4">
    <tr>
    <td align="center"><%= getTimeOver(1)%></td>
    </tr>
    </table>
    </body>
    </html>

    这里将所有代码集中在一起是为了叙述和测试方便, 具体应用你可以将类放在单独一个文件, 然后多处调用. 请将适当的时候判断用户是否进行请求, 更改 intRefresh, 以便告知分页类是否重新统计记录数.


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/2/23 15:40:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/6/20 18:26:34

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    281.250ms