数据库分页算法类 仿LeadBBS

原创 2005年04月24日 18:46:00

Class Pg_Jet_Ex

      Private sCodeVer, sCodeName, sCoder, sDis
      Private Toward, Backward, TowardOrder, BackwardOrder
      Private IdxSql, QuerySql
      Public Conn
      Public PageCount, ItemCount, PageItemCount
      Public PageLast, PageStart
      Public ViewPage, ToPage, Division, StepPage, StartID
      Public OrderKey, OrderMode
      Public IdxTable, IdxKey, IdxWhere
      Public QueryTable, QueryKeys, QueryWhere

      Private Sub Class_Initialize()
            sCodeVer = "1.1.050115"
            sCodeName = "JetPage Leader!"
            sCoder = "ashi"
            sDis = "数据分页类。"
            ViewPage = 1            '浏览页面
            ToPage = 1                  '去往页面
            Division = 20            '每页显示数目
            StepPage = 5            '允许最大跳转页数
            StartID = 0                  '索引查询开始记录号,优化查询
            PageCount = 0            '页面总数
            ItemCount = 0            '记录总数
            OrderKey = "id"            '排序字段,使用数据库中的索引字段,存在于索引表和数据表中的共有数据,在表中具有唯一值
            OrderMode = "asc"      '排序方式
            IdxKey = "id"            '索引字段名称,存在于索引表和数据表中的共有字段
            IdxTable = ""            '索引表
            IdxWhere = ""            '索引表Where
            QueryKeys = ""            '查询字段名称
            QueryTable = ""            '查询表
            QueryWhere = ""            '查询表Where
      End Sub
     
      Private Sub OrderChoose()
            Select Case LCase(OrderMode)
                  Case "desc"
                        OrderMode = "desc"
                        Toward = "<"
                        TowardOrder = "desc"
                        Backward = ">"
                        BackwardOrder = "asc"
                  Case Else
                        OrderMode = "asc"
                        Toward = ">"
                        TowardOrder = "asc"
                        Backward = "<"
                        BackwardOrder = "desc"
            End Select
      End Sub
     
      Private Sub CountPage()
            Dim Rs, Sql, sT
            If IdxWhere <> "" Then sT = " Where " & IdxWhere
            Sql = "Select Count(*) From " & IdxTable & sT
            'Debug.addsql(Sql)
            'Sys.Dbplus()
            Set Rs = Conn.ExeCute(Sql)
            If Not Rs.Eof Then
                  ItemCount = cCur(Rs(0))
            End If
            Rs.Close()
            Set Rs = Nothing
      End Sub
     
      Private Sub ListPage()
            Dim iMovePg, iaMovePg
            Dim iTop, iDis, i, itc
            Dim iMode
            Dim Rs, at, aw, sw
            Dim st
           
            PageCount = ItemCount / Division
            If ItemCount Mod Division > 0 Then PageCount = PageCount + 1

            If ToPage =< 1 Then
                  iMode = 1
            ElseIf ToPage >= PageCount Then
                  if StartId <= 0 Then
                        iMode = -1
                  Else
                        iMode = 0
                        iMovePg = ToPage - ViewPage
                        iaMovePg = Abs(iMovePg)
                        iTop = iaMovePg * Division
                        iDis = iTop - Division
                        If iaMovePg > StepPage Or iaMovePg = 0 Then iMode = -1
                        If StartID =< 0 Then iMode = -1
                  End If
            Else
                  iMode = 0
                  iMovePg = ToPage - ViewPage
                  iaMovePg = Abs(iMovePg)
                  iTop = iaMovePg * Division
                  iDis = iTop - Division
                  If iaMovePg > StepPage Or iaMovePg = 0 Then iMode = 1
                  If StartID =< 0 Then iMode = 1
            End If
                       
            If IdxWhere <> "" Then st = " Where " & IdxWhere
           
            Select Case iMode
                  Case 1
                        ToPage = 1
                        iTop = Division
                        iDis = 0
                        iMovePg = 1
                        If PageCount = 1 Then iTop = ItemCount
                        IdxSql = "Select Top " & iTop & " " & IdxKey & " From " & IdxTable & st & " Order By " & OrderKey & " " & TowardOrder
                  Case -1
                        ToPage = PageCount
                        iTop = ItemCount - (PageCount - 1) * Division
                        iDis = 0
                        iMovePg = -1
                        IdxSql = "Select Top " & iTop & " " & IdxKey & " From " & IdxTable & st & " Order By " & OrderKey & " " & BackwardOrder
                  Case 0
                        If IdxWhere <> "" Then st = IdxWhere & " And "
                        If iMovePg < 0 Then
                              IdxSql = "Select Top " & iTop & " " & IdxKey & " From " & IdxTable & " Where " & st & OrderKey & Backward & StartID & " Order By " & OrderKey & " " & BackwardOrder
                        Else
                              IdxSql = "Select Top " & iTop & " " & IdxKey & " From " & IdxTable & " Where " & st & OrderKey & Toward & StartID & " Order By " & OrderKey & " " & TowardOrder
                        End If
            End Select

            Set Rs = Conn.Execute(IdxSql)
            'Debug.AddSql IdxSql
            'Sys.Dbplus
           
            If Rs.Eof Then
                  Rs.Close()
                  Set Rs = Nothing
                  Set Conn = Noting
                  Sys.ShowErr sCodeName, sCodeVer, "未找到请求的索引(" & IdxSql & ")。"
            Else
                  If iDis > 0 Then Rs.Move(iDis)
                  If Rs.Eof Then
                        Rs.Close()
                        Set Rs = Nothing
                        ToPage = 1
                        ListPage()
                        Exit Sub
                  End If
                  aw = Rs.GetRows(-1)
                  Rs.Close()
                  Set Rs = Nothing
                  itc = Ubound(aw,2)
                  ReDim At(itc)
                  For i = 0 To itc
                        at(i) = aw(0, i)
                  Next
                  aw = Empty
                  If iMovePg < 0 Then
                        PageStart = at(itc)
                        PageLast = at(0)
                  Else
                        PageStart = at(0)
                        PageLast = at(itc)
                  End If
                  If isNumeric(at(0)) Then
                        sw = Join(at, ",")
                  Else
                        sw = "'" & join(at, "','") & "'"
                  End If
                  If QueryWhere <> "" Then
                        QueryWhere = QueryWhere & " And "
                  End If                       
                  QuerySql = "Select " & QueryKeys & " From " & QueryTable & " Where " & QueryWhere & IdxKey & " In(" & sw & ") Order By " & OrderKey & " " & OrderMode
                  'Debug.addsql(QuerySql)
                  'Sys.Dbplus()
            End If
           
            PageItemCount = iTc + 1
            ViewPage = ToPage
      End Sub
     
      Public Property Get Rec()
            If ItemCount = 0 Then
                  CountPage()
            End If
            OrderChoose()
            ListPage()
            Rec = Conn.Execute(QuerySql).Getrows(-1)
      End Property

End Class

调用实例:

Dim obj
Set obj = New Pg_Jet_Ex

With obj
     .Division = 20
     .IdxKey = "ID"
     .IdxTable = "markList"
     .QueryKeys = "考号,姓名,语文总分"
     .QueryTable = "markList"
     .StepPage = 5
     .ViewPage = sys.Requestnum("p")
     .ToPage = sys.Requestnum("t")
     .StartId = sys.Requestnum("s")
     .OrderKey = "Id"
     .OrderMode = "asc"
     .ItemCount = 375
     Set .Conn = mCon
     Rs = .Rec
     Set .Conn = Nothing
     Set mcon = Nothing
End With
With xs
.load "plug_mark2"
.OpenTag "marks"
     .Tag "item"
           For i = 0 To obj.pageitemcount - 1
                 .pVar(Array("序号","考号","姓名","语文总分")) = Array(i+1,rs(0,i),rs(1,i),rs(2,i))
           Next
     .EndTag
     .pVar("startid") = obj.PageStart
     .pVar("endid") = obj.PageLast
     .pVar("viewpage") = obj.viewpage
     .pVar("pagecount") = obj.pagecount
     .pVar("itemcount") = obj.itemcount
     .pVar("division") = obj.division
     If b Then .pVar("ableorder") = ""
.EndTag
.res
End With

 

生成链接条的客户端脚本

           <script language="javascript">
           vpg=<xsl:value-of select="marks/viewpage" />;
           sid=<xsl:value-of select="marks/startid" />;
           eid=<xsl:value-of select="marks/endid" />;
           pagecount=<xsl:value-of select="marks/pagecount" />;
           itemcount=<xsl:value-of select="marks/itemcount" />;
           <xsl:text disable-output-escaping="yes">

           if(vpg>1){
                 document.write("<a href=netx.asp?t=1>首页</a> <a href=netx.asp?p="+vpg+"&t="+(vpg-1)+"&s="+sid+">上一页</a>")
           }
           else{
           document.write("<span disabled>首页 上一页</span>")
           }
           document.write(" 页面: "+vpg+" / "+pagecount+" 统计: "+itemcount+" 条记录 ");
           if(vpg<pagecount){
                 document.write("<a href=netx.asp?p="+vpg+"&t="+(vpg+1)+"&s="+eid+">下一页</a> <a href=netx.asp?t="+pagecount+">尾页</a>")
           }
           else{
                 document.write("<span disabled>下一页 尾页</span>")
           }

           </script>

因为我的模板用的是xslt所以,大家凑合看

MS SQL Server数据库查询优化及分页算法

探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页。以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]...

海量数据库的查询优化及分页算法方案

海量数据库的查询优化及分页算法方案   很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误...

一个通用的数据库分页类

  • 2004年08月02日 13:34
  • 1KB
  • 下载

海量数据库的查询优化及分页算法方案

(一)深入浅出理解索引结构   实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(no...

PHP通用的数据库分页类

  • 2008年11月19日 19:45
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库分页算法类 仿LeadBBS
举报原因:
原因补充:

(最多只允许输入30个字)