主なアイデア: 1 つのステートメントを使用してレコード数をカウントし (クエリ中に Recordcount 属性を取得せずに)、それを 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 ミリ秒未満で安定しています。最初のページから最後のページまでのジャンプは安定しています。ページにかかる時間は 350 ミリ秒を超えません。
適用範囲: 通常のページングに使用されます。より複雑なクエリには適していません。条件が %favorite% のような [タイトル] の場合、クエリ時間が大幅に増加します。タイトル フィールドにインデックスが付けられていても役に立ちません。 (
<%@言語 = vbscript コードページ=936%>
<%明示的なオプション%>
<%
ディム intdatestart
intdatestart = タイマー()
rem ## データベース接続を開く
レム ################################################ # ###############
関数 f__openconn()
暗い strdbpath
薄暗いコンセント
strdbpath = ../db/test.mdb
connstr = プロバイダ=microsoft.jet.oledb.4.0;データ ソース=
connstr = connstr & サーバー.マップパス(strdbpath)
set conn =server.createobject(adodb.connection)
conn.open connstr
終了関数
レム ################################################ # ###############
rem ## データベース接続を閉じる
レム ################################################ # ###############
関数 f__closeconn()
if isobject(conn) then
接続閉じる
終了する場合
conn = 何も設定しない
終了関数
レム ################################################ # ###############
rem は実行時間を取得します
レム ################################################ # ###############
関数 gettimeover(iflag)
薄暗い時間
iflag = 1 の場合
ttimeover = formatnumber(timer() - intdatestart, 6, true)
gettimeover = 実行時間: & ttimeover & 秒
それ以外
ttimeover = formatnumber((timer() - intdatestart) * 1000, 3, true)
gettimeover = 実行時間: & ttimeover & ミリ秒
終了する場合
終了関数
レム ################################################ # ###############
クラス cls_pageview
プライベートsbooinitstate
プライベート sstrcookies 名
プライベート sstrpageurl
プライベート sstrpagevar
プライベート sstrtablename
プライベート sstrfieldslist
プライベート ストラコンディクション
プライベート ストラオーダーリスト
プライベート sstrprimarykey
プライベートシントレフレッシュ
プライベートシンレコードカウント
プライベート sintpagesize
プライベートシントページ今
プライベート sintpagemax
プライベートソビコン
プライベート sstrpageinfo
プライベートサブクラス_初期化
clearvars() を呼び出す
エンドサブ
プライベートサブクラス_terminate()
sobjconn = 何も設定しない
エンドサブ
パブリックサブクリア変数()
sbooinitstate = false
sstrcookiesname=
sstrpageurl=
sstrpagevar = ページ
sstrtablename=
sstrfieldslist =
sstrcondiction =
sstrorderlist =
sstrprimarykey=
シントレリフレッシュ=0
sintrecordcount = 0
sintpagesize=0
sintpagenow=0
sintpagemax=0
エンドサブ
rem ## レコード数を保持する Cookie 変数
パブリック プロパティ let strcookiesname(value)
sstrcookiesname = 値
終了プロパティ
rem ## リダイレクトアドレス
パブリック プロパティ let strpageurl(value)
sstrpageurl = 値
終了プロパティ
rem ## テーブル名
パブリック プロパティ let strtablename(value)
sstrtablename = 値
終了プロパティ
rem ## フィールドリスト
パブリック プロパティ let strfieldslist(value)
sstrfieldslist = 値
終了プロパティ
rem ## クエリ条件
パブリック プロパティ let strcondiction(value)
値 <> の場合
sstrcondiction = ここで & 値
それ以外
sstrcondiction =
終了する場合
終了プロパティ
rem ## 並べ替えフィールド ([id] asc、[createdatetime] desc など)
パブリック プロパティ let strorderlist(value)
値 <> の場合
sstrorderlist = 順序と値
それ以外
sstrorderlist =
終了する場合
終了プロパティ
rem ## レコード数をカウントするために使用されるフィールド
パブリック プロパティ let strprimarykey(value)
sstrprimarykey = 値
終了プロパティ
rem ## 各ページに表示されるレコードの数
パブリック プロパティ let intpagesize(value)
sintpagesize = tonum(値, 20)
終了プロパティ
rem ## データベース接続オブジェクト
パブリック プロパティ let objconn(value)
sobjconn = 値を設定します
終了プロパティ
残り ## 現在のページ
パブリック プロパティ let intpagenow(value)
sintpagenow = tonum(値, 1)
終了プロパティ
rem ## ページパラメータ
パブリック プロパティ let strpagevar(value)
sstrpagevar = 値
終了プロパティ
rem ## リフレッシュするかどうか。1 はリフレッシュを意味し、その他の値はリフレッシュしません。
パブリック プロパティ let intrefresh(value)
sintrefresh = tonum(値, 0)
終了プロパティ
rem ## 現在のページを取得する
パブリック プロパティ get intpagenow()
intpagenow = singpagenow
終了プロパティ
rem ## ページネーション情報
パブリック プロパティ get strpageinfo()
strpageinfo = sstrpageinfo
終了プロパティ
rem ## レコードセット、2次元配列または文字列を取得します。ループ出力を実行する際にはisarray()を使用して判断する必要があります
パブリック プロパティ get arrrecordinfo()
sbooinitstate でない場合は、
終了プロパティ
終了する場合
ディム、SQL
sql = 選択 & sstrfieldslist & _
から & sstrtablename & _
sstrcondiction&_
ストオーダーリスト
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)
それ以外
arrecordinfo=
終了する場合
それ以外
arrecordinfo=
終了する場合
rs.close
setrs=なし
終了プロパティ
rem ## レコード数の初期化
プライベートサブ初期レコードカウント()
sintrecordcount = 0
そうでない場合は(sbooinitstate)、subを終了します
薄暗くなった
sinttmp = tonum(request.cookies(_xp_ & sstrcookiesname), -1)
if ((sinttmp < 0) または (sintrefresh = 1))then
ディムSQL、RS
sql = select count( & sstrprimarykey & ) & _
から & sstrtablename & _
ストコンディクション
set rs = sobjconn.execute(sql)
rs.eof または rs.bof の場合
sinttmp = 0
それ以外
sinttmp = rs(0)
終了する場合
sintrecordcount = sinttmp
response.cookies(_xp_ & sstrcookiesname) = sinttmp
それ以外
sintrecordcount = sinttmp
終了する場合
エンドサブ
rem ## ページング情報の初期化
private sub initpageinfo()
sstrpageinfo=
そうでない場合は(sbooinitstate)、subを終了します
ディムカール
surl = sstrpageurl
if instr(1, surl, ?, 1) > 0 then
サール = サール & & & sstrpagevar & =
それ以外
サール = サール & & sstrpagevar & =
終了する場合
sintpagenow <= 0 の場合、sintpagenow = 1
sintrecordcount mod sintpagesize = 0 の場合
sintpagemax = sintrecordcountsintpagesize
それ以外
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 & total<strong> & sintrecordcount & </strong> レコード<strong> & sintpagesize & </strong> レコード/ページ
エンドサブ
rem ## 長整数変換
プライベート関数 tonum(s、デフォルト)
s = s &
s <> かつ isnumeric(s) の場合
tonum = clng(s)
それ以外
tonum=デフォルト
終了する場合
終了関数
rem ## クラスの初期化
パブリックサブinitclass()
sbooinitstate = true
if not(isobject(sobjconn)) then sbooinitstate = false
initrecordcount() を呼び出す
initpageinfo() を呼び出す
エンドサブ
終了クラス
ディム strlocalurl
strlocalurl = request.servervariables(script_name)
薄暗い内部ページ今
intpagenow = request.querystring(ページ)
dim intpagesize、strpageinfo
intpagesize=30
薄暗いarrrecordinfo、i
薄暗い
f__openconn
dimclsレコード情報
set clsrecordinfo = 新しい cls_pageview
clsrecordinfo.strtablename = [mytable]
clsrecordinfo.strpageurl = strlocalurl
clsrecordinfo.strfieldslist = [id], [title], [lasttime]
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
setclsrecordinfo=なし
f__クローズコン
%>
<html>
<頭>
<meta http-equiv=content-type content=text/html;
<title>ページングテスト</title>
<スタイルタイプ=テキスト/css>
<!--
.pageview {
フォントサイズ: 12px;
}
.pageview td {
ボーダー右スタイル: ソリッド;
ボーダーボトムスタイル: ソリッド;
ボーダー右の色: #e0e0e0;
ボーダーボトムカラー: #e0e0e0;
ボーダー右幅: 1px;
ボーダーの下の幅: 1px;
}
.pageview テーブル {
ボーダー左スタイル: 実線;
ボーダートップスタイル: ソリッド;
境界線の左の色: #e0e0e0;
ボーダートップカラー: #e0e0e0;
ボーダー上部の幅: 1px;
ボーダー左幅: 1px;
}
tr.header {
背景: #eff7ff;
フォントサイズ: 14px;
フォントの太さ: 太字;
行の高さ: 120%;
テキスト整列: 中央;
}
-->
</スタイル>
<スタイルタイプ=テキスト/css>
<!--
体 {
フォントサイズ: 12px;
}
a:リンク{
色: #993300;
テキスト装飾: なし。
}
a: 訪問しました {
色: #003366;
テキスト装飾: なし。
}
a:ホバー{
色: #0066cc;
テキスト装飾: 下線;
}
a:アクティブ {
色: #000000;
テキスト装飾: なし。
}
テーブル {
フォントサイズ: 12px;
}
-->
</スタイル>
</head>
<本文>
<テーブル幅=100% ボーダー=0 セルスペース=0 セルパディング=4>
<tr>
<td> <%= strpageinfo%></td>
</tr>
</テーブル>
<div class=pageview>
<テーブル幅=100% ボーダー=0 セルスペース=0 セルパディング=4>
<tr class=header>
<td>id</td>
<td>説明</td>
<td>日付</td>
</tr>
<%
if isarray(arrrecordinfo) then
for i = 0 から ubound(arrrecordinfo, 2)
%>
<tr>
<td> <%= arrrecordinfo(0, i)%></td>
<td> <%= arrrecordinfo(1, i)%></td>
<td> <%= arrrecordinfo(2, i)%></td>
</tr>
<%
次
終了する場合
%>
</テーブル>
</div>
<テーブル幅=100% ボーダー=0 セルスペース=0 セルパディング=4>
<tr>
<td> <%= strpageinfo%></td>
</tr>
</テーブル>
<テーブル幅=100% ボーダー=0 セルスペース=0 セルパディング=4>
<tr>
<td align=center> <%= gettimeover(1)%></td>
</tr>
</テーブル>
</body>
</html>