查询翻页优化

复制代码 代码如下:

  <SCRIPT language=VBSCRIPT RUNAT=SERVER>

  '//---- COCOON_自定义类_翻页优化代码 ----//'

  Class cc_db_Pager

  '--------------------------------

  '     COCOON Db_Pager 类 (Ver: 1.02)

  '     作者: Sunrise_Chen ([email protected])

  '     请保留此信息,谢谢。

  '

  '     2003/06 修正一个错误,描述:如果ID不唯一,将产生多条重复记录的错误。

  '                           2003.5

  '--------------------------------

  '//-------------------- 定义变量 --------------------//'

  Private sTableName        '//表名

  Private sSqlString        '//自定义Sql语句

  Private aCondition()        '//查询条件(数组)

  Private sCondition        '//查询条件(字符串)

  Private iPage        '//当前页码

  Private iPageSize        '//每页记录数

  Private iPageCount        '//总页数

  Private iRecCount        '//当前查询条件下的记录数

  Private iTotalRecCount    '//总记录数

  Private sFields        '//输出的字段名

  Private sOrderBy        '//排序字符串

  Private sSql        '//当前的查询语句

  Private sPkey        '//主键

  Private oConn        '//连接对象

  Private iDefPageSize        '//默认每页显示的记录数

  Private sProjectName        '/项目名

  Private sVersion        '/版本号

  Private bShowError        '//是否显示错误信息

  '//-------------------- 事件、方法 --------------------//'

  '//类初始化事件

  Private Sub Class_Initialize()

  ReDim aCondition(-1)

  iPage        = 1

  iRecCount        = Null

  iTotalRecCount    = Null

  iPageCount        = Null

  bShowError        = True

  iPageSize        = 10

  sFields        = "*"

  sPkey        = "ID"

  sCondition        = ""

  sOrderBy        = ""

  sSqlString        = ""

  sProjectName    = "COCOON 类系列 数据库翻页优化"

  sVersion        = "1.02"

  End Sub

  '//类结束事件

  Private Sub Class_Terminate()

  Set oConn = Nothing

  End Sub

  '//错误处理

  Public Sub doError(s)

  Dim sTmp

  sTmp = CLng(Rnd() * 100)

  Response.write( "<DIV STYLE='WIDTH:760;font-size:9pt;cursor:hand'>" )

  Response.write( "<LABEL ONCLICK='ERRORDIV"&sTmp&".style.display=(ERRORDIV"&sTmp&".style.display==""""?""none"":"""")'>" )

  Response.write( "<SPAN STYLE='BACKGROUND-COLOR:#CCCC00;COLOR:WHITE;'>〖 CC_db_Pager 提示信息 〗</SPAN><BR></LABEL>" )

  Response.write( "<DIV ID='ERRORDIV"&sTmp&"' STYLE='DISPLAY:NONE;WIDTH:100%;" )

  Response.write( "BORDER: 1PX SOLID #CCCC00;PADDING:5;overflow:hidden;text-overflow:ellipsis;'><NOBR>" )

  Response.write( "<SPAN STYLE='COLOR:RED'>Description</SPAN>: " & s & "<BR>" )

  Response.write( "<SPAN STYLE='COLOR:RED'>Provider</SPAN>: " & sProjectName )

  Response.write( "  <SPAN STYLE='COLOR:RED'>Version</SPAN>: " & sVersion & "<BR>" )

  Response.write( "</NOBR></DIV></DIV><BR>" )

  End Sub

  '//产生分页的SQL语句

  Public Function getSql()

  Dim iStart, iEnd

  Call makeCondition()

  iStart = ( iPage - 1 ) * iPageSize

  iEnd = iStart + iPageSize

  getSql  = " SELECT DISTINCT " & sFields & " FROM ["&sTableName&"] " _

  & " WHERE ["&sPKey&"] NOT IN ( " _

  & "   SELECT TOP "&iStart&" ["&sPKey&"] FROM ["&sTableName&"] " & sCondition & " " & sOrderBy & " " _

  & " )" _

  & " AND ["&sPKey&"] IN ( " _

  & "   SELECT TOP "&iEnd&" ["&sPKey&"] FROM ["&sTableName&"] " & sCondition & " " & sOrderBy & " " _

  & " )" _

  & " " & sOrderBy & " "

  End Function

  '//产生条件字符串

  Private Sub makeCondition()

  If UBound(aCondition)>=0 Then

  sCondition = " WHERE " & Join(aCondition, " AND ")

  End If

  End Sub

  '//计算总记录数(带条件)

  Private Sub CaculateRecCount()

  On Error Resume Next

  Dim oRs

  Call makeCondition()

  Set oRs = oConn.Execute( "SELECT COUNT(["&sPKey&"]) FROM [" & sTableName & "]" & sCondition )

  If Err Then

  doError Err.Description

  Response.End()

  End If

  iRecCount = oRs.Fields.Item(0).Value

  Set oRs = Nothing

  End Sub

  '//计算总记录数(不带条件)

  Private Sub CaculateTotalRecCount()

  On Error Resume Next

  Dim oRs

  Set oRs = oConn.Execute( "SELECT COUNT(["&sPKey&"]) FROM [" & sTableName & "]" )

  If Err Then

  doError Err.Description

  Response.End()

  End If

  iTotalRecCount = oRs.Fields.Item(0).Value

  Set oRs = Nothing

  End Sub

  '//计算页数

  Private Sub CaculatePageCount()

  If isNull(iRecCount) Then CaculateRecCount()

  If iRecCount = 0 Then iPageCount = 0 : Exit Sub

  iPageCount = Abs( Int( 0 - (iRecCount / iPageSize) ) )

  End Sub

  '//增加条件

  Public Sub AddCondition(s)

  If Len(s)<0 Then Exit Sub

  ReDim Preserve aCondition(UBound(aCondition)+1)

  aCondition(UBound(aCondition)) = s

  End Sub

  '//版本信息

  Public Function Information()

  doError "Coding by <A HREF='MAILTO:[email protected]'>Sunrise_Chen</A> @ <A HREF='http://www.ccopus.com'>http://www.ccopus.com</A> ."

  End Function

  '//-------------------- 输入属性 --------------------//'

  '//定义连接对象

  Public Property Set ActiveConnection(o)

  Set oConn = o

  End Property

  '//定义查询表名

  Public Property Let TableName(s)

  sTableName = s

  End Property

  '//定义需要输出的字段名

  Public Property Let Fields(s)

  sFields = s

  End Property

  '//定义主键

  Public Property Let Pkey(s)

  sPkey = s

  End Property

  '//定义排序规则

  Public Property Let OrderBy(s)

  sOrderBy = " ORDER BY " & s & " "

  End Property

  '//定义每页的记录条数

  Public Property Let PageSize(s)

  iPageSize = s

  If Not isNumeric(iPageSize) Then iPageSize = iDefaultPageSize

  If CLng(iPageSize)<1 Then iPageSize = iDefaultPageSize

  End Property

  '//定义当前页码

  Public Property Let Page(s)

  iPage = s

  If Not isNumeric(iPage) Then iPage = 1

  If CLng(iPage)<1 Then iPage = 1

  Call CaculatePageCount()

  If CLng(iPage)>CLng(iPageCount) And iPageCount>0 Then iPage = iPageCount

  End Property

  '//自定义查询语句

  Public Property Let Sql(s)

  sSqlString = s

  End Property

  '//-------------------- 输出属性 --------------------//'

  '//取得当前条件下的记录数

  Public Property Get RecordCount

  If isNull(iRecCount) Then CaculateRecCount()

  RecordCount = iRecCount

  End Property

  '//取得当前页码

  Public Property Get Page

  Page = iPage

  End Property

  '//取得当前页码

  Public Property Get AbsolutePage

  AbsolutePage = iPage

  End Property

  '//取得当前查询的条件

  Public Property Get Condition

  If Len(sCondition)<1 Then makeCondition()

  Condition = sCondition

  End Property

  '//取得总的记录数

  Public Property Get TotalRecordCount

  If isNull(iTotalRecCount) Then CaculateTotalRecCount()

  TotalRecordCount = iTotalRecCount

  End Property

  '//取得总页数

  Public Property Get PageCount

  If isNull(iPageCount) Then CaculatePageCount()

  PageCount = iPageCount

  End Property

  '//得到分页后的记录集

  Public Property Get Recordset

  On Error Resume Next

  sSql = getSql()

  Set Recordset = oConn.Execute( sSql )

  If Err Then

  If bShowError Then doError Err.Description

  If Len(sSqlString)>0 Then

  Set Recordset = oConn.Execute( sSqlString )

  If Err Then

  doError Err.Description

  Response.End()

  End If

  Else

  doError Err.Description

  End If

  End If

  Err.Clear()

  End Property

  '//版本信息

  Public Property Get Version

  Version = sVersion

  End Property

  End Class

  </SCRIPT>

  使用说明

  

复制代码 代码如下:

  Class cc_db_Pager

  Public Property Let ConnectionString    '//设置连接字符串

  Public Property Set ActiveConnection(o)    '//设置连接对象(与ConnectionString属性二者取一)

  Public Property Let TableName(s)    '//设置查询表名或视图名

  Public Property Let Fields(s)        '//设置输出字段名(可省略,默认为"*",即所有字段)

  Public Property Let Pkey(s)        '//设置主键(可省略,默认为"ID")

  Public Property Let OrderBy(s)        '//排序规则(可省略,省略则按默认规则排序)

  Public Property Let Page(s)        '//设置当前页码

  Public Property Let PageSize(s)        '//设置每页记录数

  Public Property Let Sql(s)        '//容错的SQL语句(此功能有待进完善,暂保留)

  Puvlic Property Get Sql        '//返回已翻页的SQL语句

  Public Property Get RecordCount        '//返回当前记录数

  Public Property Get TotalRecordCoun    '//返回总记录数

  Public Property Get Condition        '//保留

  Public Property Get PageCount        '//返回总页数

  Public Property Get Recordset        '//返回已分页的记录集(核心)

  Public Property Get Version        '//返回本段代码的版本信息

  Public Property Get Page        '//返回当前页码

  Public Property Get AbsolutePage    '//返回当前页(同上)

  Public Function Information()

  Private Function getSql()

  Private Sub makeCondition()

  Private Sub CaculateRecCount()

  Private Sub CaculateTotalRecCount()

  Private Sub CaculatePageCount()

  Private Sub AddCondition(s)

  Private Sub Class_Initialize()

  Private Sub Class_Terminate()

  End Class

  使用方法演示

  

复制代码 代码如下:

  <SCRIPT language="JavaScript">

  function doPage(n){

  location.href=location.pathname+'?page='+n+'&其他条件...';

  }

  </SCRIPT>

  <%

  Dim oDbPager

  iPageSize = DefaultPageSize

  Set oDbPager = New cc_db_Pager

  Set oDbPager.ActiveConnection = oConn

  oDbPager.TableName = "t_Company"

  oDbPager.Fields = "ID,Company,WebSite,MainProduct,UserLevel, Status, Phone, Fax"

  oDbPager.Pkey = "ID"

  oDbPager.OrderBy = "UserLevel DESC, Status DESC, CharIndex('中国',Country) DESC, ID DESC"

  oDbPager.PageSize = iPageSize

  oDbPager.AddCondition "Status>0"

  If Not isEmpty(Request.QueryString("Auth1")) Then

  oDbPager.AddCondition "Auth1>0"

  End If

  oDbPager.Page = Request.QueryString("page")

  iCurrPage = oDbPager.Page

  iRecCount = oDbPager.RecordCount

  iPageCount = oDbPager.PageCount

  sPageInfo = "当前页为 "&iCurrPage&" 共计 "&iPageCount&" 个页面 共有 "&iRecCount&" 条信息"

  sPager  = "" &  vbCrLf _

  & "[<A "&IIf(CInt(iCurrPage)<=1,"disabled href='javascript:void(0);'","href='javascript:doPage(1);'")&">首页</A>]" & vbCrLf _

  & "[<A "&IIf(CInt(iCurrPage)<=1,"disabled href='javascript:void(0);'","href='javascript:doPage("&(iCurrPage-1)&");'")&">前页</A>]" & vbCrLf _

  & "[<A "&IIf(CInt(iCurrPage)>=CInt(iPageCount),"disabled href='javascript:void(0);'","href='javascript:doPage("&(iCurrPage+1)&");'")&">后页</A>]" & vbCrLf _

  & "[<A "&IIf(CInt(iCurrPage)>=CInt(iPageCount),"disabled href='javascript:void(0);'","href='javascript:doPage("&iPageCount&");'")&">末页</A>]"

  %>

  ...

  <%

  Set oRs = oDbPager.Recordset

  Do While Not oRs.Eof

  '// ...

  oRs.MoveNext()

  Loop

  %>

  ...

  <%=sPageInfo%>

  ...

  <%=sPager%>