Die Hauptidee: Verwenden Sie eine Anweisung, um die Anzahl der Datensätze zu zählen (anstatt beim Abfragen das RecordCount-Attribut abzurufen), sie in Cookies zwischenzuspeichern und beim Springen nicht erneut zu zählen. Verwenden Sie das AbsolutePage-Attribut von ADO, um zu springen Der Einfachheit halber wurden die Hauptteile des Codes als Klasse bezeichnet und erläutert
: AMD Athlon XP 2600+, 256 DDR
Softwareumgebung: MS Windows 2000 Advanced Server + IIS 5.0 + Access 2000 + IE 6.0
Testergebnisse: Die anfängliche Laufzeit beträgt 250 (Startseite) – 400 (letzte Seite) Millisekunden. (Nachdem die Datensatznummer zwischengespeichert wurde) liegt der Sprung zwischen den Seiten stabil bei weniger als 47 Millisekunden. Der Sprung von der ersten zur letzten Seite Seite dauert nicht länger als 350 Millisekunden.
Anwendbarer Bereich: Wird für normales Paging verwendet. Nicht für komplexere Abfragen geeignet: Wenn die Bedingung „[Titel] Wie „%favorite%““ lautet, verlängert sich die Abfragezeit erheblich Das Feld „Titel“ ist indiziert, es ist nutzlos :(
< %@LANGUAGE = "VBScript" CODEPAGE="936"%>
<%Option Explicit%>
<%
Dim intDateStart
intDateStart = Timer()
Rem ## Datenbankverbindung öffnen
Rem ############################################# ##############
Funktion f__OpenConn()
Dimmen Sie strDbPath
Dimmkonstr
strDbPath = "../db/test.mdb"
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
connstr = connstr & Server.MapPath(strDbPath)
Setze conn = Server.CreateObject("Adodb.Connection")
conn.open connstr
Funktion beenden
Rem ############################################# ##############
Rem ## Datenbankverbindung schließen
Rem ############################################# ##############
Funktion f__CloseConn()
Wenn IsObject(conn) Dann
Verbindung schließen
Ende wenn
Setze conn = nichts
Funktion beenden
Rem ############################################# ##############
Rem bekommt Hinrichtungszeit
Rem ############################################# ##############
Funktion getTimeOver(iflag)
Dimmen Sie tTimeOver
Wenn iflag = 1, dann
tTimeOver = FormatNumber(Timer() - intDateStart, 6, true)
getTimeOver = "Ausführungszeit: " & tTimeOver & " Sekunden"
Anders
tTimeOver = FormatNumber((Timer() - intDateStart) * 1000, 3, true)
getTimeOver = "Ausführungszeit: " & tTimeOver & " Millisekunden"
Ende wenn
Funktion beenden
Rem ############################################# ##############
Klasse Cls_PageView
Privater sbooInitState
Privater sstrCookiesName
Private sstrPageUrl
Private sstrPageVar
Privater sstrTableName
Private sstrFieldsList
Private sstrCondiction
Private sstrOrderList
Privater sstrPrimaryKey
Private sintRefresh
Privater sintRecordCount
Private sintPageSize
Private sintPageNow
Private sintPageMax
Privat sobjConn
Private sstrPageInfo
Private Sub Class_Initialize
Rufen Sie ClearVars() auf
Sub beenden
Private Unterklasse_terminate()
Setze sobjConn = nichts
Sub beenden
Öffentliche Sub-ClearVars()
sbooInitState = False
sstrCookiesName = ""
sstrPageUrl = ""
sstrPageVar = "Seite"
sstrTableName = ""
sstrFieldsList = ""
sstrCondiction = ""
sstrOrderList = ""
sstrPrimaryKey = ""
sintRefresh = 0
sintRecordCount = 0
sintPageSize = 0
sintPageNow = 0
sintPageMax = 0
Sub beenden
Rem ## Cookies-Variable, die die Anzahl der Datensätze speichert
Öffentliche Eigenschaft Let strCookiesName(Value)
sstrCookiesName = Wert
End-Eigenschaft
Rem ## Weiterleitungsadresse
Öffentliche Eigenschaft Let strPageUrl(Value)
sstrPageUrl=Wert
End-Eigenschaft
Rem ## Tabellenname
Öffentliche Eigenschaft Let strTableName(Value)
sstrTableName = Wert
End-Eigenschaft
Rem ## Feldliste
Öffentliche Eigenschaft Let strFieldsList(Value)
sstrFieldsList = Wert
End-Eigenschaft
Rem ## Abfragebedingungen
Öffentliches Eigentum Let strCondiction(Value)
Wenn Wert <> "" Dann
sstrCondiction = " WHERE " & Wert
Anders
sstrCondiction = ""
Ende wenn
End-Eigenschaft
Rem ## Sortierfelder, wie zum Beispiel: [ID] ASC, [CreateDateTime] DESC
Öffentliche Eigenschaft Let strOrderList(Value)
Wenn Wert <> "" Dann
sstrOrderList = " ORDER BY " & Wert
Anders
sstrOrderList = ""
Ende wenn
End-Eigenschaft
Rem ## Feld zum Zählen der Anzahl der Datensätze
Öffentliche Eigenschaft Let strPrimaryKey(Value)
sstrPrimaryKey = Wert
End-Eigenschaft
Rem ## Die Anzahl der auf jeder Seite angezeigten Datensätze
Öffentliche Eigenschaft Let intPageSize(Value)
sintPageSize = toNum(Wert, 20)
End-Eigenschaft
Rem ## Datenbankverbindungsobjekt
Öffentliches Eigentum Let objConn(Value)
Setze sobjConn = Wert
End-Eigenschaft
Rem ## Aktuelle Seite
Öffentliche Eigenschaft Let intPageNow(Value)
sintPageNow = toNum(Wert, 1)
End-Eigenschaft
Rem ## Seitenparameter
Öffentliche Eigenschaft Let strPageVar(Value)
sstrPageVar = Wert
End-Eigenschaft
Rem ## Ob aktualisiert werden soll. 1 bedeutet Aktualisieren, andere Werte werden nicht aktualisiert.
Öffentliches Eigentum Let intRefresh(Value)
sintRefresh = toNum(Wert, 0)
End-Eigenschaft
Rem ## Holen Sie sich die aktuelle Seite
Öffentliche Eigenschaft Get intPageNow()
intPageNow = singPageNow
End-Eigenschaft
Rem ## Informationen zur Paginierung
Öffentliche Eigenschaft Get strPageInfo()
strPageInfo = sstrPageInfo
End-Eigenschaft
Rem ## Um einen Datensatz, ein zweidimensionales Array oder eine Zeichenfolge zu erhalten, müssen Sie bei der Schleifenausgabe IsArray() zur Beurteilung verwenden.
Öffentliches Eigentum Get arrRecordInfo()
Wenn nicht sbooInitState, dann
Exit-Eigenschaft
Ende wenn
Dim rs, sql
sql = "SELECT " & sstrFieldsList & _
„FROM“ & sstrTableName & _
sstrCondiction&_
sstrOrderList
Setze rs = Server.CreateObject("Adodb.RecordSet")
rs.open sql, sobjConn, 1, 1
Wenn nicht (rs.eof oder rs.bof) dann
rs.PageSize = sintPageSize
rs.AbsolutePage = sintPageNow
Wenn nicht (rs.eof oder rs.bof) dann
arrRecordInfo = rs.getrows(sintPageSize)
Anders
arrRecordInfo = ""
Ende wenn
Anders
arrRecordInfo = ""
Ende wenn
rs.close
Setze rs = nichts
End-Eigenschaft
Rem ## Initialisiert die Anzahl der Datensätze
Private Sub InitRecordCount()
sintRecordCount = 0
Wenn nicht (sbooInitState), dann Sub beenden
Dim sintTmp
sintTmp = toNum(request.Cookies("_xp_" & sstrCookiesName), -1)
Wenn ((sintTmp < 0) Oder (sintRefresh = 1))Dann
Dim SQL, RS
sql = "SELECT COUNT(" & sstrPrimaryKey & ")" & _
„FROM“ & sstrTableName & _
sstrCondiction
Setze rs = sobjConn.execute(sql)
Wenn rs.eof oder rs.bof Dann
sintTmp = 0
Anders
sintTmp = rs(0)
Ende wenn
sintRecordCount = sintTmp
Response.Cookies("_xp_" & sstrCookiesName) = sintTmp
Anders
sintRecordCount = sintTmp
Ende wenn
Sub beenden
Rem ## Paging-Informationen initialisieren
Private Sub InitPageInfo()
sstrPageInfo = ""
Wenn nicht (sbooInitState), dann Sub beenden
Dunkles Surl
surl = sstrPageUrl
Wenn Instr(1, surl, "?", 1) > 0 Dann
surl = surl & "&" & sstrPageVar & "="
Anders
surl = surl & "?" & sstrPageVar & "="
Ende wenn
Wenn sintPageNow <= 0, dann ist sintPageNow = 1
Wenn sintRecordCount mod sintPageSize = 0 Dann
sintPageMax = sintRecordCount sintPageSize
Anders
sintPageMax = sintRecordCount sintPageSize + 1
Ende wenn
Wenn sintPageNow > sintPageMax, dann sintPageNow = sintPageMax
Wenn sintPageNow <= 1 dann
sstrPageInfo = "Startseite, vorherige Seite"
Anders
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & "1"">Home</a>"
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow - 1) & """>Vorherige Seite</a>"
Ende wenn
Wenn sintPageMax - sintPageNow < 1, dann
sstrPageInfo = sstrPageInfo & "Nächste Seite, letzte Seite"
Anders
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow + 1) & """>Nächste Seite</a> "
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & sintPageMax & """>Letzte Seite</a> "
Ende wenn
sstrPageInfo = sstrPageInfo & "Page:<strong><font color=""#990000"">" & sintPageNow & "</font> / " & sintPageMax & " </strong>"
sstrPageInfo = sstrPageInfo & "Total<strong>" & sintRecordCount & "</strong>Record<strong>" & sintPageSize & "</strong>Record/Page"
Sub beenden
Rem ## Long-Integer-Konvertierung
Private Funktion toNum(s, Default)
s = s & ""
Wenn s <> "" und IsNumeric(s) dann
toNum = CLng(s)
Anders
toNum = Standard
Ende wenn
Funktion beenden
Rem ## Klasseninitialisierung
Öffentliche Sub-InitClass()
sbooInitState = True
If Not(IsObject(sobjConn)) Then sbooInitState = False
CallInitRecordCount()
CallInitPageInfo()
Sub beenden
Unterricht beenden
Dimmen Sie strLocalUrl
strLocalUrl = request.ServerVariables("SCRIPT_NAME")
Dim intPageNow
intPageNow = request.QueryString("page")
Dimmen Sie intPageSize, strPageInfo
intPageSize = 30
Dimmen Sie arrRecordInfo, d
Dim Conn
f__OpenConn
Dimmen Sie clsRecordInfo
Legen Sie clsRecordInfo = New Cls_PageView fest
clsRecordInfo.strTableName = „[meineTabelle]“
clsRecordInfo.strPageUrl = strLocalUrl
clsRecordInfo.strFieldsList = „[ID], [Titel], [LastTime]“
clsRecordInfo.strCondiction = „[ID] < 10000“
clsRecordInfo.strOrderList = „[ID] ASC“
clsRecordInfo.strPrimaryKey = „[ID]“
clsRecordInfo.intPageSize = 20
clsRecordInfo.intPageNow = intPageNow
clsRecordInfo.strCookiesName = "RecordCount"
clsRecordInfo.strPageVar = "Seite"
clsRecordInfo.intRefresh = 0
clsRecordInfo.objConn = Verbindung
clsRecordInfo.InitClass
arrRecordInfo = clsRecordInfo.arrRecordInfo
strPageInfo = clsRecordInfo.strPageInfo
Setzen Sie clsRecordInfo = nichts
f__CloseConn
%>
<html>
<Kopf>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Paging-Test</title>
<style type="text/css">
<!--
.PageView {
Schriftgröße: 12px;
}
.PageView td {
border-right-style: solide;
border-bottom-style: solide;
Rahmenfarbe rechts: #E0E0E0;
Rahmenfarbe unten: #E0E0E0;
Rand-Rechts-Breite: 1px;
Rand-Bottom-Breite: 1px;
}
.PageView-Tabelle {
border-left-style: solide;
Rand-Top-Stil: solide;
Rand-Links-Farbe: #E0E0E0;
Rand-Top-Farbe: #E0E0E0;
Rand-oben-Breite: 1px;
Rand-Links-Breite: 1px;
}
tr.Header {
Hintergrund: #EFF7FF;
Schriftgröße: 14px;
Schriftstärke: fett;
Zeilenhöhe: 120 %;
Textausrichtung: Mitte;
}
->
</style>
<style type="text/css">
<!--
Körper {
Schriftgröße: 12px;
}
a:link {
Farbe: #993300;
Textdekoration: keine;
}
a:besucht {
Farbe: #003366;
Textdekoration: keine;
}
a:hover {
Farbe: #0066CC;
Textdekoration: unterstreichen;
}
a:aktiv {
Farbe: #000000;
Textdekoration: keine;
}
Tisch {
Schriftgröße: 12px;
}
->
</style>
</head>
<Körper>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr>
<td> <%= strPageInfo%></td>
</tr>
</table>
<div class="PageView">
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr class="Header">
<td>ID</td>
<td>Beschreibung</td>
<td>Datum</td>
</tr>
<%
Wenn IsArray(arrRecordInfo) Dann
Für i = 0 bis UBound(arrRecordInfo, 2)
%>
<tr>
<td> <%= arrRecordInfo(0, i)%></td>
<td> <%= arrRecordInfo(1, i)%></td>
<td> <%= arrRecordInfo(2, i)%></td>
</tr>
<%
Nächste
Ende wenn
%>
</table>
</div>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr>
<td> <%= strPageInfo%></td>
</tr>
</table>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr>
<td align="center"> <%= getTimeOver(1)%></td>
</tr>
</table>
</body>
</html>