主なアイデア: 1 つのステートメントを使用して (クエリ時に RecordCount 属性を取得するのではなく) レコード数をカウント (Count) し、それを Cookie にキャッシュし、ジャンプ時に ADO の AbsolutePage 属性を使用して再度カウントする必要はありません。便宜上、コードの主要部分をクラスとして説明しています
: AMD Athlon XP 2600+、256 DDR。
ソフトウェア環境:MS Windows 2000 Advanced Server + IIS 5.0 + Access 2000 + IE 6.0
テスト結果: 初期実行時間は 250 (ホーム ページ) ~ 400 (最終ページ) ミリ秒、(レコード番号がキャッシュされた後) ページ間のジャンプは 47 ミリ秒未満で安定しています。最初のページから最後のページまでのジャンプは安定しています。
より
複雑なクエリには適していません。条件が "[タイトル] '%favorite%'" の場合、クエリ時間は大幅に増加します。 Title フィールドにはインデックスが付けられていますが、役に立ちません。
< %@LANGUAGE = "VBScript" CODEPAGE="936"%>
<%オプション明示%>
<%
Dim intDateStart
intDateStart = タイマー()
Rem ## データベース接続を開く
レム ############################################# ## ##############################
関数 f__OpenConn()
ディム strDbPath
薄暗いコンセント
strDbPath = "../db/test.mdb"
connstr = "プロバイダ=Microsoft.Jet.OLEDB.4.0;データ ソース="
connstr = connstr & Server.MapPath(strDbPath)
set conn = Server.CreateObject("Adodb.Connection")
conn.open connstr
終了機能
レム ############################################# ## ##############################
Rem ## データベース接続を閉じます
レム ############################################# ## ##############################
関数 f__CloseConn()
IsObject(conn) の場合
接続閉じる
終了の場合
conn = 何も設定しない
終了機能
レム ############################################# ## ##############################
レムは実行時間を取得します
レム ############################################# ## ##############################
関数 getTimeOver(iflag)
ディムタイムオーバー
iflag = 1 の場合
tTimeOver = FormatNumber(Timer() - intDateStart, 6, true)
getTimeOver = "実行時間: " & tTimeOver & " 秒"
それ以外
tTimeOver = FormatNumber((Timer() - intDateStart) * 1000, 3, true)
getTimeOver = "実行時間: " & tTimeOver & " ミリ秒"
終了の場合
終了機能
レム ############################################# ## ##############################
クラスCls_PageView
プライベート sbooInitState
プライベート sstrCookiesName
プライベート sstrPageUrl
プライベート sstrPageVar
プライベート sstrTableName
プライベート sstrFieldsList
プライベート sstrCondiction
プライベート sstrOrderList
プライベート sstrPrimaryKey
プライベート sintRefresh
プライベート sintRecordCount
プライベート sintPageSize
プライベート sintPageNow
プライベート sintPageMax
プライベート sobjConn
プライベート sstrPageInfo
プライベートサブクラス_初期化
ClearVars() を呼び出す
エンドサブ
プライベートサブクラス_terminate()
sobjConn = 何も設定しない
エンドサブ
パブリックサブ ClearVars()
sbooInitState = False
sstrCookiesName = ""
sstrPageUrl = ""
sstrPageVar = "ページ"
sstrTableName = ""
sstrFieldsList = ""
sstrCondiction = ""
sstrOrderList = ""
sstrPrimaryKey = ""
sintRefresh = 0
sintRecordCount = 0
sintPageSize = 0
sintPageNow = 0
sintPageMax = 0
エンドサブ
Rem ## レコード数を保存する Cookie 変数
Public プロパティ Let strCookiesName(Value)
sstrCookiesName = 値
終了プロパティ
Rem ## リダイレクトアドレス
Public プロパティ Let strPageUrl(Value)
sstrPageUrl=値
終了プロパティ
Rem ## テーブル名
Public プロパティ Let strTableName(Value)
sstrTableName = 値
終了プロパティ
Rem ## フィールドリスト
Public プロパティ Let strFieldsList(Value)
sstrFieldsList = 値
終了プロパティ
Rem ## クエリ条件
Public プロパティ Let strCondiction(Value)
値 <> "" の場合
sstrCondiction = " WHERE " & 値
それ以外
sstrCondiction = ""
終了の場合
終了プロパティ
Rem ## 並べ替えフィールド ([ID] ASC、[CreateDateTime] DESC など)
Public プロパティ Let strOrderList(Value)
値 <> "" の場合
sstrOrderList = " ORDER BY " & 値
それ以外
sstrOrderList = ""
終了の場合
終了プロパティ
Rem ## レコード数をカウントするために使用されるフィールド
Public プロパティ Let strPrimaryKey(Value)
sstrPrimaryKey = 値
終了プロパティ
Rem ## 各ページに表示されるレコードの数
Public プロパティ Let intPageSize(Value)
sintPageSize = toNum(値, 20)
終了プロパティ
Rem ## データベース接続オブジェクト
Public プロパティ Let objConn(Value)
sobjConn = 値を設定します
終了プロパティ
レム ## 現在のページ
Public プロパティ Let intPageNow(Value)
sintPageNow = toNum(値, 1)
終了プロパティ
Rem ## ページパラメータ
Public プロパティ Let strPageVar(Value)
sstrPageVar = 値
終了プロパティ
Rem ## リフレッシュするかどうか。1 はリフレッシュを意味し、その他の値はリフレッシュしません。
Public プロパティ Let intRefresh(Value)
sintRefresh = toNum(値, 0)
終了プロパティ
Rem ## 現在のページを取得する
Public プロパティ Get intPageNow()
intPageNow = singPageNow
終了プロパティ
Rem ## ページネーション情報
Public プロパティ Get strPageInfo()
strPageInfo = sstrPageInfo
終了プロパティ
Rem ## レコードセット、2次元配列、文字列を取得するには、ループ出力時にIsArray()を使用して判定する必要があります。
Public プロパティ Get arrRecordInfo()
sbooInitState でない場合
終了プロパティ
終了の場合
ディム rs、sql
sql = "SELECT " & sstrFieldsList & _
" FROM " & sstrTableName & _
sstr条件&_
sstrOrderList
Set rs = Server.CreateObject("Adodb.RecordSet")
rs.open SQL、sobjConn、1、1
そうでない場合 (rs.eof または rs.bof)
rs.PageSize = sintPageSize
rs.AbsolutePage = sintPageNow
そうでない場合 (rs.eof または rs.bof)
arrRecordInfo = rs.getrows(sintPageSize)
それ以外
arrRecordInfo = ""
終了の場合
それ以外
arrRecordInfo = ""
終了の場合
rs.close
rs = 何も設定しない
終了プロパティ
Rem ## レコード数を初期化します
プライベートサブInitRecordCount()
sintRecordCount = 0
そうでない場合(sbooInitState)、Sub を終了する
ディム sintTmp
sintTmp = toNum(request.Cookies("_xp_" & sstrCookiesName), -1)
If ((sintTmp < 0) または (sintRefresh = 1))Then
ディムSQL、RS
sql = "SELECT COUNT(" & sstrPrimaryKey & ")" & _
" FROM " & sstrTableName & _
sstrCondiction
rs = sobjConn.execute(sql) を設定します。
rs.eof または rs.bof の場合
sintTmp = 0
それ以外
sintTmp = rs(0)
終了の場合
sintRecordCount = sintTmp
response.Cookies("_xp_" & sstrCookiesName) = sintTmp
それ以外
sintRecordCount = sintTmp
終了の場合
エンドサブ
Rem ## ページング情報の初期化
プライベートサブ InitPageInfo()
sstrPageInfo = ""
そうでない場合(sbooInitState)、Sub を終了する
ディムサール
サール = sstrPageUrl
Instr(1, surl, "?", 1) > 0 の場合
surl = surl & "&" & sstrPageVar & "=
それ以外
サール = サール & "?" & sstrPageVar & "=
終了の場合
sintPageNow <= 0 の場合、sintPageNow = 1
sintRecordCount mod sintPageSize = 0 の場合
sintPageMax = sintRecordCount sintPageSize
それ以外
sintPageMax = sintRecordCount sintPageSize + 1
終了の場合
sintPageNow > sintPageMax の場合 sintPageNow = sintPageMax
sintPageNow <= 1 の場合
sstrPageInfo = "ホームページの前のページ"
それ以外
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & "1"">ホーム</a>"
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow - 1) & """>前のページ</a>"
終了の場合
sintPageMax - sintPageNow < 1 の場合
sstrPageInfo = sstrPageInfo & "次のページ、最後のページ"
それ以外
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow + 1) & """>次のページ</a> "
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & sintPageMax & """>最後のページ</a> "
終了の場合
sstrPageInfo = sstrPageInfo & "ページ:<strong><font color="#990000"">" & sintPageNow & "</font> / " & sintPageMax & " </strong>"
sstrPageInfo = sstrPageInfo & "合計<strong>" & sintRecordCount & "</strong>レコード<strong>" & sintPageSize & "</strong>レコード/ページ"
エンドサブ
Rem ## 長整数変換
プライベート関数 toNum(s, Default)
s = s & ""
If s <> "" And IsNumeric(s) then
toNum = CLng(s)
それ以外
toNum = デフォルト
終了の場合
終了機能
Rem ## クラスの初期化
Public Sub InitClass()
sbooInitState = True
If Not(IsObject(sobjConn)) then sbooInitState = False
CallInitRecordCount()
CallInitPageInfo()
エンドサブ
終了クラス
Dim strLocalUrl
strLocalUrl = request.ServerVariables("SCRIPT_NAME")
Dim intPageNow
intPageNow = request.QueryString("ページ")
Dim intPageSize、strPageInfo
intPageSize = 30
薄暗い arrRecordInfo、i
ディム・コン
f__OpenConn
Dim clsRecordInfo
clsRecordInfo = 新しい Cls_PageView を設定します
clsRecordInfo.strTableName = "[myTable]"
clsRecordInfo.strPageUrl = strLocalUrl
clsRecordInfo.strFieldsList = "[ID]、[タイトル]、[最終時刻]"
clsRecordInfo.strCondiction = "[ID] < 10000"
clsRecordInfo.strOrderList = "[ID] ASC"
clsRecordInfo.strPrimaryKey = "[ID]"
clsRecordInfo.intPageSize = 20
clsRecordInfo.intPageNow = intPageNow
clsRecordInfo.strCookiesName = "レコード数"
clsRecordInfo.strPageVar = "ページ"
clsRecordInfo.intRefresh = 0
clsRecordInfo.objConn = コン
clsRecordInfo.InitClass
arrRecordInfo = clsRecordInfo.arrRecordInfo
strPageInfo = clsRecordInfo.strPageInfo
clsRecordInfo = 何も設定しない
f__クローズコン
%>
<html>
<頭>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>ページングテスト</title>
<style type="text/css">
<!--
.PageView {
フォントサイズ: 12px;
}
.PageView td {
ボーダー右スタイル: ソリッド;
ボーダーボトムスタイル: ソリッド;
ボーダー右の色: #E0E0E0;
ボーダーボトムカラー: #E0E0E0;
ボーダー右幅: 1px;
ボーダーの下の幅: 1px;
}
.PageView テーブル {
ボーダー左スタイル: 実線;
ボーダートップスタイル: ソリッド;
ボーダー左の色: #E0E0E0;
ボーダートップカラー: #E0E0E0;
ボーダー上部の幅: 1px;
ボーダー左幅: 1px;
}
tr.ヘッダー {
背景: #EFF7FF;
フォントサイズ: 14px;
フォントの太さ: 太字;
行の高さ: 120%;
テキスト整列: 中央;
}
-->
</スタイル>
<style type="text/css">
<!--
体 {
フォントサイズ: 12px;
}
a:リンク{
色: #993300;
テキスト装飾: なし。
}
a: 訪問しました {
色: #003366;
テキスト装飾: なし。
}
a:ホバー{
カラー: #0066CC;
テキスト装飾: 下線;
}
a:アクティブ {
色: #000000;
テキスト装飾: なし。
}
テーブル {
フォントサイズ: 12px;
}
-->
</スタイル>
</head>
<本文>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr>
<td> <%= strPageInfo%></td>
</tr>
</テーブル>
<div class="ページビュー">
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr class="ヘッダー">
<td>ID</td>
<td>説明</td>
<td>日付</td>
</tr>
<%
IsArray(arrRecordInfo) の場合
i = 0 から UBound(arrRecordInfo, 2) の場合
%>
<tr>
<td> <%= arrRecordInfo(0, i)%></td>
<td> <%= arrRecordInfo(1, i)%></td>
<td> <%= arrRecordInfo(2, i)%></td>
</tr>
<%
次
終了の場合
%>
</テーブル>
</div>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr>
<td> <%= strPageInfo%></td>
</tr>
</テーブル>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr>
<td align="center"> <%= getTimeOver(1)%></td>
</tr>
</テーブル>
</body>
</html>