Ide utamanya: Gunakan satu pernyataan untuk menghitung (Menghitung) jumlah catatan (alih-alih mendapatkan atribut RecordCount saat melakukan kueri), menyimpannya dalam cache di Cookie, dan tidak perlu menghitung lagi saat melompat. Gunakan atribut AbsolutePage ADO untuk melompat ke halaman. Untuk kenyamanan Dipanggil dan ditulis sebagai sebuah kelas, bagian utama dari kode telah dijelaskan.
Lingkungan perangkat keras: AMD Athlon XP 2600+, 256 DDR
Lingkungan perangkat lunak: MS Windows 2000 Advanced Server + IIS 5.0 + Access 2000 + IE 6.0
Hasil pengujian: Waktu pengoperasian awal adalah 250 (halaman beranda) - 400 (halaman terakhir) milidetik, (setelah nomor catatan di-cache) lompatan antar halaman stabil kurang dari 47 milidetik halaman tidak memakan waktu lebih dari 350 milidetik.
Rentang yang berlaku : Digunakan untuk paging biasa. Tidak cocok untuk kueri yang lebih kompleks: jika kondisinya adalah "[Judul] Suka '%favorit%'", waktu kueri akan sangat meningkat, meskipun jika bidang Judul diindeks, itu akan sia-sia :(
< %@LANGUAGE = "VBScript" CODEPAGE="936"%>
<%Opsi Eksplisit%>
<%
Redupkan intDateStart
intDateStart = Timer()
Rem ## Buka koneksi database
Rem ################################################# ## ##############
fungsi f__OpenConn()
Redupkan strDbPath
Konsentrasi redup
strDbPath = "../db/test.mdb"
connstr = "Penyedia=Microsoft.Jet.OLEDB.4.0;Sumber Data="
koneksi = koneksi & Server.MapPath(strDbPath)
Setel samb = Server.CreateObject("Adodb.Connection")
koneksi.buka koneksi
Fungsi akhir
Rem ################################################# ## ##############
Rem ## Tutup koneksi database
Rem ################################################# ## ##############
fungsi f__CloseConn()
Jika IsObject(sambungan) Lalu
samb.tutup
Akhiri Jika
Setel samb = tidak ada
Fungsi akhir
Rem ################################################# ## ##############
Rem mendapat waktu eksekusi
Rem ################################################# ## ##############
fungsi getTimeOver(iflag)
Redupkan TimeOver
Jika iflag = 1 Maka
tTimeOver = FormatNumber(Timer() - intDateStart, 6, benar)
getTimeOver = "Waktu eksekusi: " & tTimeOver & " detik"
Kalau tidak
tTimeOver = FormatNumber((Timer() - intDateStart) * 1000, 3, benar)
getTimeOver = "Waktu eksekusi: " & tTimeOver & " milidetik"
Akhiri Jika
Fungsi akhir
Rem ################################################# ## ##############
Kelas Cls_PageView
SbooInitState pribadi
SstrCookiesName pribadi
SstrPageUrl pribadi
SstrPageVar pribadi
SstrTableName pribadi
SstrFieldsList pribadi
SstrCondiction pribadi
SstrOrderList pribadi
SstrPrimaryKey pribadi
SintRefresh pribadi
SintRecordCount pribadi
SintPageSize pribadi
SintPageNow pribadi
SintPageMax pribadi
SobjConn pribadi
SstrPageInfo pribadi
Sub Kelas Pribadi_Inisialisasi
Panggil ClearVars()
Akhiri Sub
Sub kelas_terminate() Pribadi
Setel sobjConn = tidak ada
Akhiri Sub
Sub Publik ClearVars()
sbooInitState = Salah
sstrCookiesName = ""
sstrPageUrl = ""
sstrPageVar = "halaman"
sstrNamaTabel = ""
sstrFieldsList = ""
sstrKondisi = ""
sstrOrderList = ""
sstrPrimaryKey = ""
sintRefresh = 0
sintRecordCount = 0
sintUkuranHalaman = 0
sintPageSekarang = 0
sintPageMax = 0
Akhiri Sub
Variabel Rem ## Cookies yang menyimpan jumlah record
Properti Publik Biarkan strCookiesName(Nilai)
sstrCookiesName = Nilai
Properti Akhir
Rem ## alamat pengalihan
Properti Publik Biarkan strPageUrl(Nilai)
sstrPageUrl=Nilai
Properti Akhir
Rem ## nama tabel
Properti Publik Biarkan strTableName(Nilai)
sstrTableName = Nilai
Properti Akhir
Rem ## daftar bidang
Properti Publik Biarkan strFieldsList(Nilai)
sstrFieldsList = Nilai
Properti Akhir
Rem ## kondisi kueri
Properti Publik Biarkan strCondiction(Nilai)
Jika Nilai <> "" Lalu
sstrCondiction = " DI MANA " & Nilai
Kalau tidak
sstrKondisi = ""
Akhiri Jika
Properti Akhir
Rem ## Bidang penyortiran, seperti: [ID] ASC, [CreateDateTime] DESC
Properti Publik Biarkan strOrderList(Nilai)
Jika Nilai <> "" Lalu
sstrOrderList = " ORDER BY " & Nilai
Kalau tidak
sstrOrderList = ""
Akhiri Jika
Properti Akhir
Rem ## Field digunakan untuk menghitung jumlah record
Properti Publik Biarkan strPrimaryKey(Nilai)
sstrPrimaryKey = Nilai
Properti Akhir
Rem ## Jumlah record yang ditampilkan pada setiap halaman
Properti Publik Biarkan intPageSize(Nilai)
sintPageSize = toNum(Nilai, 20)
Properti Akhir
Rem ## Objek koneksi database
Properti Publik Biarkan objConn(Nilai)
Tetapkan sobjConn = Nilai
Properti Akhir
Rem ## Halaman saat ini
Properti Publik Biarkan intPageNow(Nilai)
sintPageNow = toNum(Nilai, 1)
Properti Akhir
Rem ## Parameter halaman
Properti Publik Biarkan strPageVar(Nilai)
sstrPageVar = Nilai
Properti Akhir
Rem ## Apakah akan menyegarkan. 1 berarti menyegarkan, nilai lain tidak menyegarkan.
Properti Publik Biarkan intRefresh(Nilai)
sintRefresh = toNum(Nilai, 0)
Properti Akhir
Rem ## Dapatkan halaman saat ini
Properti Publik Dapatkan intPageNow()
intPageNow = bernyanyiPageNow
Properti Akhir
Rem ## Informasi paginasi
Properti Publik Dapatkan strPageInfo()
strPageInfo = sstrPageInfo
Properti Akhir
Rem ## Untuk mendapatkan kumpulan rekaman, array atau string dua dimensi, Anda harus menggunakan IsArray() untuk menilai saat melakukan keluaran loop.
Properti Publik Dapatkan arrRecordInfo()
Jika Bukan sbooInitState Lalu
Keluar dari Properti
Akhiri Jika
Redupkan rs, sql
sql = "PILIH " & sstrFieldsList & _
" DARI " & sstrNamaTabel & _
sstrKondisi&_
sstrOrderList
Setel rs = Server.CreateObject("Adodb.RecordSet")
rs.open sql, sobjConn, 1, 1
Jika Tidak(rs.eof atau rs.bof) Lalu
rs.PageSize = sintPageSize
rs.AbsolutePage = sintPageSekarang
Jika Tidak(rs.eof atau rs.bof) Lalu
arrRecordInfo = rs.getrows(sintPageSize)
Kalau tidak
arrRecordInfo = ""
Akhiri Jika
Kalau tidak
arrRecordInfo = ""
Akhiri Jika
rs.tutup
Setel rs = tidak ada
Properti Akhir
Rem ## Inisialisasi jumlah catatan
Sub Pribadi InitRecordCount()
sintRecordCount = 0
Jika Tidak(sbooInitState) Kemudian Keluar dari Sub
Redupkan sintTmp
sintTmp = toNum(permintaan.Cookies("_xp_" & sstrCookiesName), -1)
Jika ((sintTmp < 0) Atau (sintRefresh = 1))Lalu
Redupkan sql, rs
sql = "PILIH JUMLAH(" & sstrPrimaryKey & ")" & _
" DARI " & sstrNamaTabel & _
kondisi sstr
Setel rs = sobjConn.execute(sql)
Jika rs.eof atau rs.bof Lalu
sintTmp = 0
Kalau tidak
sintTmp = rs(0)
Akhiri Jika
sintRecordCount = sintTmp
respon.Cookies("_xp_" & sstrCookiesName) = sintTmp
Kalau tidak
sintRecordCount = sintTmp
Akhiri Jika
Akhiri Sub
Rem ## Inisialisasi informasi paging
Sub InitPageInfo Pribadi()
sstrPageInfo = ""
Jika Tidak(sbooInitState) Kemudian Keluar dari Sub
Redupkan permukaannya
surl = sstrPageUrl
Jika Instr(1, surl, "?", 1) > 0 Lalu
surl = surl & "&" & sstrPageVar & "="
Kalau tidak
surl = surl & "?" & sstrPageVar & "="
Akhiri Jika
Jika sintPageNow <= 0 Maka sintPageNow = 1
Jika sintRecordCount mod sintPageSize = 0 Lalu
sintPageMax = sintRecordCount sintPageSize
Kalau tidak
sintPageMax = sintRecordCount sintPageSize + 1
Akhiri Jika
Jika sintPageNow > sintPageMax Maka sintPageNow = sintPageMax
Jika sintPageNow <= 1 maka
sstrPageInfo = "Halaman beranda halaman sebelumnya"
Kalau tidak
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & "1"">Beranda</a>"
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow - 1) & """>Halaman sebelumnya</a>"
Akhiri Jika
Jika sintPageMax - sintPageNow < 1 maka
sstrPageInfo = sstrPageInfo & "Halaman berikutnya halaman terakhir"
Kalau tidak
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow + 1) & """>Halaman selanjutnya</a> "
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & sintPageMax & """>Halaman terakhir</a> "
Akhiri Jika
sstrPageInfo = sstrPageInfo & "Halaman:<strong><font color=""#990000"">" & sintPageNow & "</font> / " & sintPageMax & " </strong>"
sstrPageInfo = sstrPageInfo & "Total<strong>" & sintRecordCount & "</strong>Record<strong>" & sintPageSize & "</strong>Record/Page"
Akhiri Sub
Rem ## konversi bilangan bulat panjang
Fungsi pribadi toNum(s, Default)
s = s & ""
Jika s <> "" Dan IsNumerik Maka
toNum = CLng(s)
Kalau tidak
toNum = Default
Akhiri Jika
Fungsi akhir
Rem ## Inisialisasi kelas
Sub InitClass Publik ()
sbooInitState = Benar
Jika Tidak(IsObject(sobjConn)) Maka sbooInitState = False
CallInitRecordCount()
PanggilanInitPageInfo()
Akhiri Sub
Kelas Akhir
Redupkan strLocalUrl
strLocalUrl = permintaan.ServerVariables("SCRIPT_NAME")
Redupkan intPageNow
intPageNow = permintaan.QueryString("halaman")
Redupkan intPageSize, strPageInfo
intUkuranPage = 30
Redupkan arrRecordInfo, i
Sambungan Redup
f__OpenConn
Redupkan clsRecordInfo
Setel clsRecordInfo = Cls_PageView Baru
clsRecordInfo.strTableName = "[Tabel Saya]"
clsRecordInfo.strPageUrl = strLocalUrl
clsRecordInfo.strFieldsList = "[ID], [Judul], [Waktu Terakhir]"
clsRecordInfo.strCondiction = "[ID] <10000"
clsRecordInfo.strOrderList = "[ID] ASC"
clsRecordInfo.strPrimaryKey = "[ID]"
clsRecordInfo.intPageSize = 20
clsRecordInfo.intPageNow = intPageNow
clsRecordInfo.strCookiesName = "Jumlah Catatan"
clsRecordInfo.strPageVar = "halaman"
clsRecordInfo.intRefresh = 0
clsRecordInfo.objConn = Sambungan
clsRecordInfo.InitClass
arrRecordInfo = clsRecordInfo.arrRecordInfo
strPageInfo = clsRecordInfo.strPageInfo
Setel clsRecordInfo = tidak ada
f__TutupConn
%>
<html>
<kepala>
<meta http-equiv="Jenis Konten" content="teks/html; charset=gb2312">
<title>Uji paging</title>
<gaya tipe="teks/css">
<!--
.Tampilan Halaman {
ukuran font: 12px;
}
.Tampilan Halaman td {
gaya batas kanan: padat;
gaya batas bawah: padat;
warna tepi kanan: #E0E0E0;
warna batas bawah: #E0E0E0;
lebar tepi kanan: 1 piksel;
lebar batas bawah: 1 piksel;
}
.Tabel Tampilan Halaman {
gaya batas kiri: padat;
gaya tepi atas: padat;
batas-kiri-warna: #E0E0E0;
warna batas atas: #E0E0E0;
lebar batas atas: 1 piksel;
lebar tepi kiri: 1 piksel;
}
tr.Header {
latar belakang: #EFF7FF;
ukuran font: 14px;
berat font: tebal;
tinggi garis: 120%;
perataan teks: tengah;
}
-->
</gaya>
<gaya tipe="teks/css">
<!--
tubuh {
ukuran font: 12px;
}
a: tautan {
warna: #993300;
dekorasi teks: tidak ada;
}
a: mengunjungi {
warna: #003366;
dekorasi teks: tidak ada;
}
a: arahkan kursor {
warna: #0066CC;
dekorasi teks: garis bawah;
}
a: aktif {
warna: #000000;
dekorasi teks: tidak ada;
}
meja {
ukuran font: 12px;
}
-->
</gaya>
</kepala>
<tubuh>
<lebar tabel="100%" border="0" Cellspacing="0" cellpadding="4">
<tr>
<td> <%= strPageInfo%></td>
</tr>
</tabel>
<div kelas="Tampilan Halaman">
<lebar tabel="100%" border="0" Cellspacing="0" cellpadding="4">
<tr kelas="Tajuk">
<td>tanda pengenal</td>
<td>Deskripsi</td>
<td>Tanggal</td>
</tr>
<%
Jika IsArray(arrRecordInfo) Lalu
Untuk i = 0 hingga UBound(arrRecordInfo, 2)
%>
<tr>
<td> <%= arrRecordInfo(0, i)%></td>
<td> <%= arrRecordInfo(1, i)%></td>
<td> <%= arrRecordInfo(2, i)%></td>
</tr>
<%
Berikutnya
Akhiri Jika
%>
</tabel>
</div>
<lebar tabel="100%" border="0" Cellspacing="0" cellpadding="4">
<tr>
<td> <%= strPageInfo%></td>
</tr>
</tabel>
<lebar tabel="100%" border="0" Cellspacing="0" cellpadding="4">
<tr>
<td align="center"> <%= getTimeOver(1)%></td>
</tr>
</tabel>
</tubuh>
</html>