SQL语句查询翻页优化

查询翻页优化

--------------------------------------------------------------------------------
作者: 不详     来源: 我的求职网
更新日期:2005-6-28 17:50:32   阅读次数:19  
查询翻页优化    

<SCRIPT language=VBSCRIPT RUNAT=SERVER>

//---- COCOON_自定义类_翻页优化代码 ----//
Class cc_db_Pager
--------------------------------
      COCOON Db_Pager 类 (Ver: 1.02)
--------------------------------

//-------------------- 定义变量 --------------------//
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:sunrise_chen@msn.com>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%>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值