Die Hauptidee: Verwenden Sie eine Anweisung, um die Anzahl der Datensätze zu zählen (ohne das Attribut „recordcount“ während der Abfrage abzurufen), sie in Cookies zwischenzuspeichern und beim Springen nicht erneut zählen zu müssen. Verwenden Sie das Attribut „absolutepage“ von ado, um zur Seite zu springen. Der Einfachheit halber werden die Hauptteile des Codes erläutert, da er als Klasse aufgerufen und geschrieben wird
Hardwareumgebung: 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 Das Aufrufen einer Seite dauert nicht länger als 350 Millisekunden.
Anwendungsbereich: Wird für normales Paging verwendet. Nicht für komplexere Abfragen geeignet: Wenn die Bedingung [Titel] wie %favorite% ist, wird die Abfragezeit erheblich verlängert, selbst wenn das Titelfeld indiziert ist: (
<%@sprache = vbscript codepage=936%>
<%option explizit%>
<%
dim intdatestart
intdatestart = timer()
rem ## Datenbankverbindung öffnen
rem ############################################# # ###############
Funktion f__openconn()
dim strdbpath
dimmen connstr
strdbpath = ../db/test.mdb
connstr = anbieter=microsoft.jet.oledb.4.0;Datenquelle=
connstr = connstr & server.mappath(strdbpath)
set conn = server.createobject(adodb.connection)
conn.open connstr
Endfunktion
rem ############################################# # ###############
rem ## Datenbankverbindung schließen
rem ############################################# # ###############
Funktion f__closeconn()
if isobject(conn) then
Verbindung schließen
Ende wenn
setze conn = nichts
Endfunktion
rem ############################################# # ###############
rem erhält Ausführungszeit
rem ############################################# # ###############
Funktion gettimeover(iflag)
dimmen Sie die Zeit
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
Endfunktion
rem ############################################# # ###############
Klasse cls_pageview
privater sbooinitstate
privater sstrcookiesname
private strpageurl
private sstrpagevar
privater Tabellenname
private sstrfieldslist
private sstrcondiction
private strorderlist
privater Sstrprimärschlüssel
private sintrefresh
private sintrecordcount
private sintpagesize
private Sintpagenow
private sintpagemax
private sobjconn
private sstrpageinfo
private Unterklasse_initialize
rufe clearvars() auf
Ende sub
private Unterklasse_terminate()
setze sobjconn = nichts
Ende sub
öffentliche Sub-Clearvars()
sbooinitstate = false
sstrcookiesname=
sstrpageurl=
sstrpagevar = Seite
sstrtablename=
sstrfieldslist =
sstrcondiction =
sstrorderlist =
sstrprimarykey=
sintrefresh=0
sintrecordcount = 0
sintpagesize=0
sintpagenow=0
sintpagemax=0
Ende sub
rem ## Cookies-Variable, die die Anzahl der Datensätze enthält
öffentliche Eigenschaft let strcookiesname(value)
sstrcookiesname = Wert
Ende Eigentum
rem ## Weiterleitungsadresse
öffentliches Eigentum let strpageurl(value)
sstrpageurl = Wert
Ende Eigentum
rem ## Tabellenname
öffentliche Eigenschaft let strtablename(value)
sstrtablename = Wert
Ende Eigentum
rem ## Feldliste
öffentliches Eigentum let strfieldslist(value)
sstrfieldslist = Wert
Ende Eigentum
rem ## Abfragebedingungen
öffentliches Eigentum let strcondiction(value)
wenn Wert <> dann
sstrcondiction = wo & Wert
anders
sstrcondiction =
Ende wenn
Ende Eigentum
rem ## Sortieren von Feldern wie: [id] aufsteigend, [erstelltatetime] absteigend
öffentliches Eigentum let strorderlist(value)
wenn Wert <> dann
sstrorderlist = Sortieren nach & Wert
anders
sstrorderlist =
Ende wenn
Ende Eigentum
rem ## Feld zum Zählen der Anzahl der Datensätze
öffentliche Eigenschaft let strprimarykey(value)
sstrprimarykey = Wert
Ende Eigentum
rem ## Die Anzahl der auf jeder Seite angezeigten Datensätze
öffentliche Eigenschaft let intpagesize(value)
sintpagesize = tonum(value, 20)
Ende Eigentum
rem ## Datenbankverbindungsobjekt
öffentliches Eigentum let objconn(value)
setze sobjconn = Wert
Ende Eigentum
rem ## aktuelle Seite
öffentliches Eigentum let intpagenow(value)
sintpagenow = tonum(value, 1)
Ende Eigentum
rem ## Seitenparameter
öffentliches Eigentum let strpagevar(value)
sstrpagevar = Wert
Ende Eigentum
rem ## Ob aktualisiert werden soll. 1 bedeutet Aktualisieren, andere Werte werden nicht aktualisiert
öffentliches Eigentum let intrefresh(value)
sintrefresh = tonum(value, 0)
Ende Eigentum
rem ## Holen Sie sich die aktuelle Seite
öffentliches Eigentum get intpagenow()
intpagenow = singpagenow
Ende Eigentum
rem ## Paginierungsinformationen
öffentliches Eigentum get strpageinfo()
strpageinfo = sstrpageinfo
Ende Eigentum
rem ## Rufen Sie den Datensatz, das zweidimensionale Array oder die Zeichenfolge ab. Bei der Schleifenausgabe müssen Sie zur Beurteilung isarray() verwenden
öffentliches Eigentum get arrrecordinfo()
Wenn nicht, dann sbooinitstate
Exit-Eigenschaft
Ende wenn
dimrs, sql
sql = select & sstrfieldslist & _
von & sstrtablename & _
sstrcondiction&_
sstrorderlist
set 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
setrs=nichts
Ende Eigentum
rem ## Initialisiert die Anzahl der Datensätze
privates Sub initrecordcount()
sintrecordcount = 0
Wenn nicht (sbooinitstate), dann sub beenden
dim sinttmp
sinttmp = tonum(request.cookies(_xp_ & sstrcookiesname), -1)
if ((sinttmp < 0) oder (sintrefresh = 1))then
dim sql, rs
sql = select count( & sstrprimarykey & ) & _
von & sstrtablename & _
sstrcondiction
set 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
Ende sub
rem ## Paging-Informationen initialisieren
privates 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 ist sintpagenow = sintpagemax
wenn sintpagenow <= 1 dann
sstrpageinfo = Startseite, vorherige Seite
anders
sstrpageinfo = sstrpageinfo & <a href= & surl & 1>Homepage</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> Datensätze<strong> & sintpagesize & </strong> Datensätze/Seite
Ende sub
rem ## lange Ganzzahlkonvertierung
private Funktionstonum(e, Standard)
s = s &
wenn s <> und isnumeric(s), dann
tonum = clng(s)
anders
tonum=default
Ende wenn
Endfunktion
rem ## Klasseninitialisierung
öffentliche Subinitclass()
sbooinitstate = true
Wenn nicht (isobject(sobjconn)), dann ist sbooinitstate = false
Rufen Sie initrecordcount() auf
initpageinfo() aufrufen
Ende sub
Klasse beenden
dim strlocalurl
strlocalurl = request.servervariables(script_name)
dim intpagenow
intpagenow = request.querystring(page)
dim intpagesize, strpageinfo
intpagesize=30
dim arrrecordinfo,i
schwacher Anschluss
f__openconn
dimclsrecordinfo
set clsrecordinfo = new cls_pageview
clsrecordinfo.strtablename = [mytable]
clsrecordinfo.strpageurl = strlocalurl
clsrecordinfo.strfieldslist = [id], [title], [lasttime]
clsrecordinfo.strcondiction = [id] < 10000
clsrecordinfo.strorderlist = [id] aufsteigend
clsrecordinfo.strprimarykey = [id]
clsrecordinfo.intpagesize = 20
clsrecordinfo.intpagenow = intpagenow
clsrecordinfo.strcookiesname = Datensatzanzahl
clsrecordinfo.strpagevar = Seite
clsrecordinfo.intrefresh = 0
clsrecordinfo.objconn = conn
clsrecordinfo.initclass
arrrecordinfo = clsrecordinfo.arrrecordinfo
strpageinfo = clsrecordinfo.strpageinfo
setclsrecordinfo=nichts
f__closeconn
%>
<html>
<Kopf>
<meta http-equiv=content-type content=text/html;
<title>Paging-Test</title>
<style type=text/css>
<!--
.pageview {
Schriftgröße: 12px;
}
.pageview td {
border-right-style: solide;
border-bottom-style: solide;
border-right-color: #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: unterstrichen;
}
a:aktiv {
Farbe: #000000;
Textdekoration: keine;
}
Tisch {
Schriftgröße: 12px;
}
->
</style>
</head>
<Körper>
<Tabellenbreite=100 % Rand=0 Zellenabstand=0 Zellenpadding=4>
<tr>
<td> <%= strpageinfo%></td>
</tr>
</table>
<div class=pageview>
<Tabellenbreite=100 % Rand=0 Zellenabstand=0 Zellenpadding=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>
<Tabellenbreite=100 % Rand=0 Zellenabstand=0 Zellenpadding=4>
<tr>
<td> <%= strpageinfo%></td>
</tr>
</table>
<Tabellenbreite=100 % Rand=0 Zellenabstand=0 Zellenpadding=4>
<tr>
<td align=center> <%= gettimeover(1)%></td>
</tr>
</table>
</body>
</html>