zoukankan      html  css  js  c++  java
  • Access2000数据库80万记录通用快速分页类

    刚用的,不错。给大家看看
       主要思路: 用一条语句统计(Count)出记录数(而不在查询时获得 RecordCount 属性), 缓存在 Cookies 中, 跳转时就不用再次统计. 使用 ADO 的 AbsolutePage 属性进行页面跳转即可. 为方便调用而写成类, 代码主要地方已有说明

    硬件环境: 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, 6true)
       getTimeOver 
    = " 执行时间: " & tTimeOver & " 秒"
      
    Else
       tTimeOver 
    = FormatNumber((Timer() - intDateStart) * 10003true)
       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, 
    11
       
    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 < 0Or (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>&nbsp;<%= 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>&nbsp;<%= arrRecordInfo(0, i)%></td>
        
    <td>&nbsp;<%= arrRecordInfo(1, i)%></td>
        
    <td>&nbsp;<%= arrRecordInfo(2, i)%></td>
      
    </tr>
    <%
       
    Next
      
    End If
    %>
    </table>
    </div>
    <table width="100%" border="0" cellspacing="0" cellpadding="4">
      
    <tr> 
      
    <td>&nbsp;<%= strPageInfo%></td>
    </tr>
    </table>
    <table width="100%" border="0" cellspacing="0" cellpadding="4">
      
    <tr> 
        
    <td align="center">&nbsp;<%= getTimeOver(1)%></td>
      
    </tr>
    </table>
    </body>
    </html>

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    Java大小写转换
    java基础总结第一部分
    7-1 哥尼斯堡的“七桥问题” (25 分)
    关于并查集问题
    L1-049 天梯赛座位分配 (20 分)
    fuser 好命令
    android phone retmote control vlc player
    ubuntu 启动失败 虚惊一场
    useful vim
    cross_compile mtd-utils 出错解决
  • 原文地址:https://www.cnblogs.com/Athrun/p/1126194.html
Copyright © 2011-2022 走看看