硬件環(huán)境: AMD Athlon XP 2600+, 256 DDR
軟件環(huán)境: MS Windows 2000 Advanced Server + IIS 5.0 + Access 2000 + IE 6.0
測試結(jié)果: 初次運行在 250(首頁) - 400(末頁)毫秒, (記錄數(shù)緩存后)在頁面間跳轉(zhuǎn)穩(wěn)定在 47 毫秒以下.第1頁跳到最后一頁不多于 350 毫秒
適用范圍: 用于普通分頁. 不適用于有較復雜的查詢時: 如條件為"[Title] Like %最愛%", 查詢的時間大大增加, 就算 Title 字段作了索引也沒用. :(
%
Dim intDateStart
intDateStart = Timer()
Rem ## 打開數(shù)據(jù)庫連接
Rem #################################################################
function f__OpenConn()
Dim strDbPath
Dim connstr
strDbPath = "fenye/db.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 ## 關(guān)閉數(shù)據(jù)庫連接
Rem #################################################################
function f__CloseConn()
If IsObject(conn) Then
conn.close
End If
Set conn = nothing
End function
Rem #################################################################
Rem 獲得執(zhí)行時間
Rem #################################################################
function getTimeOver(iflag)
Dim tTimeOver
If iflag = 1 Then
tTimeOver = FormatNumber(Timer() - intDateStart, 6, true)
getTimeOver = " 執(zhí)行時間: " tTimeOver " 秒"
Else
tTimeOver = FormatNumber((Timer() - intDateStart) * 1000, 3, true)
getTimeOver = " 執(zhí)行時間: " 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
sintRecordCount = 0
sintPageSize = 0
sintPageNow = 0
sintPageMax = 0
End Sub
Rem ## 保存記錄數(shù)的 Cookies 變量
Public Property Let strCookiesName(Value)
sstrCookiesName = Value
End Property
Rem ## 轉(zhuǎn)向地址
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 ## 用于統(tǒng)計記錄數(shù)的字段
Public Property Let strPrimaryKey(Value)
sstrPrimaryKey = Value
End Property
Rem ## 每頁顯示的記錄條數(shù)
Public Property Let intPageSize(Value)
sintPageSize = toNum(Value, 20)
End Property
Rem ## 數(shù)據(jù)庫連接對象
Public Property Let objConn(Value)
Set sobjConn = Value
End Property
Rem ## 當前頁
Public Property Let intPageNow(Value)
sintPageNow = toNum(Value, 1)
End Property
Rem ## 頁面參數(shù)
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 ## 取得記錄集, 二維數(shù)組或字串, 在進行循環(huán)輸出時必須用 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 ## 初始化記錄數(shù)
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
Rem ## 長整數(shù)轉(zhuǎn)換
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