L'idée principale : utilisez une instruction pour compter le nombre d'enregistrements (sans obtenir l'attribut recordcount lors de la requête), mettez-la en cache dans les cookies et n'avez pas besoin de compter à nouveau lors du saut. Utilisez l'attribut Absolutepage d'ado pour accéder à la page. Pour plus de commodité Appelé et écrit en classe, les principales parties du code ont été expliquées
Environnement matériel : amd athlon xp 2600+, 256 ddr
Environnement logiciel : ms windows 2000 advanced server + iis 5.0 + access 2000 + ie 6.0
Résultats du test : Le temps d'exécution initial est de 250 (page d'accueil) - 400 (dernière page) millisecondes, (une fois le numéro d'enregistrement mis en cache) le saut entre les pages est stable à moins de 47 millisecondes. Le saut de la première page à la dernière. la page ne prend pas plus de 350 millisecondes.
Champ d'application : utilisé pour la pagination ordinaire. Ne convient pas aux requêtes plus complexes : si la condition est [titre] comme %favorite%, le temps de requête sera considérablement augmenté, même si le champ titre est indexé, il sera inutile : (
<%@langue = page de code vbscript=936%>
<%option explicite%>
<%
dim intdatestart
intdatestart = minuterie()
rem ## Ouvrir la connexion à la base de données
rem ############################################### # ###############
fonction f__openconn()
faible chemin strdb
dim constr
strdbpath = ../db/test.mdb
connstr = fournisseur = microsoft.jet.oledb.4.0; source de données =
connstr = connstr & serveur.mappath(strdbpath)
set conn = serveur.createobject (adodb.connection)
conn.open connstr
fonction de fin
rem ############################################### # ###############
rem ## Fermer la connexion à la base de données
rem ############################################### # ###############
fonction f__closeconn()
si isobject(conn) alors
connexion.fermer
finir si
définir la connexion = rien
fonction de fin
rem ############################################### # ###############
rem obtient le temps d'exécution
rem ############################################### # ###############
fonction gettimeover (iflag)
le temps est passé
si iflag = 1 alors
ttimeover = formatnumber(timer() - intdatestart, 6, true)
gettimeover = temps d'exécution : & ttimeover & secondes
autre
ttimeover = formatnumber((timer() - intdatestart) * 1000, 3, true)
gettimeover = temps d'exécution : & ttimeover & millisecondes
finir si
fonction de fin
rem ############################################### # ###############
classe cls_pageview
sbooinitstate privé
nom de cookies sstr privé
sstrpageurl privé
sstrpagevar privé
nom de table privé
liste de champs sstr privée
conflit privé
liste de commandes privée
clé privée sstrprimarykey
sintrefresh privé
compte sintrecord privé
taille de la page sint privée
page de site privée maintenant
pagemax privée
sobjconn privé
informations sur la page sstr privée
sous-classe_initialize privée
appelez clearvars()
fin du sous
sous-classe privée_terminate()
définir sobjconn = rien
fin du sous
sous-clearvars publics()
sbooinitstate = faux
sstrcookiesname=
sstrpageurl=
sstrpagevar = page
nom_sstrtable=
sstrfieldslist =
sstrcondiction =
liste de commandes =
sstrprimarykey=
sintrefresh=0
nombre d'enregistrements sintre = 0
sintpagesize=0
sintpagenow=0
sintpagemax=0
fin du sous
rem ## Variable de cookies contenant le nombre d'enregistrements
propriété publique let strcookiesname (valeur)
sstrcookiesname = valeur
propriété finale
rem ## adresse de redirection
propriété publique let strpageurl (valeur)
sstrpageurl = valeur
propriété finale
rem ## nom de la table
propriété publique let strtablename (valeur)
nom de la table sstr = valeur
propriété finale
rem ## liste de champs
propriété publique let strfieldslist (valeur)
sstrfieldslist = valeur
propriété finale
rem ## Conditions de requête
propriété publique laisser strcondiction (valeur)
si valeur <> alors
sstrcondiction = où & valeur
autre
sstrcondiction =
finir si
propriété finale
rem ## Tri des champs, tels que : [id] asc, [createdatetime] desc
propriété publique let strorderlist (valeur)
si valeur <> alors
sstrorderlist = trier par & valeur
autre
liste de commandes =
finir si
propriété finale
rem ## Champ utilisé pour compter le nombre d'enregistrements
propriété publique let strprimarykey (valeur)
sstrprimarykey = valeur
propriété finale
rem ## Le nombre d'enregistrements affichés sur chaque page
propriété publique let intpagesize (valeur)
sintpagesize = tonum(valeur, 20)
propriété finale
rem ## Objet de connexion à la base de données
propriété publique let objconn (valeur)
définir sobjconn = valeur
propriété finale
rem ## page actuelle
propriété publique let intpagenow (valeur)
sintpagenow = tonum(valeur, 1)
propriété finale
rem ## paramètres de la page
propriété publique let strpagevar (valeur)
sstrpagevar = valeur
propriété finale
rem ## S'il faut actualiser. 1 signifie actualiser, les autres valeurs ne sont pas actualisées.
propriété publique laissée rafraîchir (valeur)
sintrefresh = tonum(valeur, 0)
propriété finale
rem ## Récupérer la page actuelle
propriété publique obtenir intpagenow()
intpagenow = singpagenow
propriété finale
rem ## Informations sur la pagination
propriété publique obtenir strpageinfo()
strpageinfo = sstrpageinfo
propriété finale
rem ## Obtenez le jeu d'enregistrements, un tableau ou une chaîne à deux dimensions, vous devez utiliser isarray() pour juger lors de l'exécution de la sortie de boucle
propriété publique obtenir arrrecordinfo()
sinon sbooinitstate alors
quitter la propriété
finir si
dimrs, sql
sql = sélectionner & sstrfieldslist & _
de & sstrtablename & _
sstrcondiction&_
liste de commandes
définir rs = serveur.createobject (adodb.recordset)
rs.open sql, sobjconn, 1, 1
sinon (rs.eof ou rs.bof) alors
rs.pagesize = sintpagesize
rs.absolutepage = sintpagenow
sinon (rs.eof ou rs.bof) alors
arrrecordinfo = rs.getrows(sintpagesize)
autre
arrrecordinfo=
finir si
autre
arrrecordinfo=
finir si
rs.fermer
setrs = rien
propriété finale
rem ## Initialiser le nombre d'enregistrements
sous-initrecordcount privé()
nombre d'enregistrements sintre = 0
sinon (sbooinitstate), alors quittez le sous
faible sinttmp
sinttmp = tonum(request.cookies(_xp_ & sstrcookiesname), -1)
si ((sinttmp < 0) ou (sintrefresh = 1))alors
faible sql, rs
sql = sélectionnez le nombre ( & sstrprimarykey & ) & _
de & sstrtablename & _
forte condiction
définir rs = sobjconn.execute(sql)
si rs.eof ou rs.bof alors
sinttmp = 0
autre
sinttmp = rs(0)
finir si
sintrecordcount = sinttmp
réponse.cookies(_xp_ & sstrcookiesname) = sinttmp
autre
sintrecordcount = sinttmp
finir si
fin du sous
rem ## Initialiser les informations de pagination
sous-initpageinfo privé()
sstrpageinfo=
sinon (sbooinitstate), alors quittez le sous
sombre surl
surl = strpageurl
si instr(1, surl, ?, 1) > 0 alors
surl = surl & & & sstrpagevar & =
autre
surl = surl & ? & sstrpagevar & =
finir si
si sintpagenow <= 0 alors sintpagenow = 1
si sintrecordcount mod sintpagesize = 0 alors
sintpagemax = sintrecordcount\sintpagesize
autre
sintpagemax = sintrecordcount \ sintpagesize + 1
finir si
si sintpagenow > sintpagemax alors sintpagenow = sintpagemax
si sintpagenow <= 1 alors
sstrpageinfo = Page d'accueil page précédente
autre
sstrpageinfo = sstrpageinfo & <a href= & surl & 1>Page d'accueil</a>
sstrpageinfo = sstrpageinfo & <a href= & surl & (sintpagenow - 1) & >Page précédente</a>
finir si
si sintpagemax - sintpagenow < 1 alors
sstrpageinfo = sstrpageinfo & page suivante dernière page
autre
sstrpageinfo = sstrpageinfo & <a href= & surl & (sintpagenow + 1) & >page suivante</a>
sstrpageinfo = sstrpageinfo & <a href= & surl & sintpagemax & >dernière page</a>
finir si
sstrpageinfo = sstrpageinfo & page : <strong><font color=#990000> & sintpagenow & </font> / & sintpagemax & </strong>
sstrpageinfo = sstrpageinfo & total<strong> & sintrecordcount & </strong> records<strong> & sintpagesize & </strong> records/page
fin du sous
rem ## conversion d'entier long
tonum(s) de fonction privée, par défaut
s = s &
si s <> et est numérique alors
tonum = accroche(s)
autre
tonum=par défaut
finir si
fonction de fin
rem ## Initialisation de la classe
sous-classe d'initialisation publique()
sbooinitstate = vrai
sinon (isobject (sobjconn)) alors sbooinitstate = false
appelez initrecordcount()
appelez initpageinfo()
fin du sous
terminer le cours
faible strlocalurl
strlocalurl = request.servervariables (nom_script)
estomper la page d'entrée maintenant
intpagenow = request.querystring(page)
dim intpagesize, strpageinfo
tailleintpage=30
dim arrrecordinfo, je
faible connexion
f__openconn
dimclsrecordinfo
définir clsrecordinfo = nouveau cls_pageview
clsrecordinfo.strtablename = [matable]
clsrecordinfo.strpageurl = strlocalurl
clsrecordinfo.strfieldslist = [id], [titre], [dernière heure]
clsrecordinfo.strcondiction = [id] < 10000
clsrecordinfo.strorderlist = [id] asc
clsrecordinfo.strprimarykey = [id]
clsrecordinfo.intpagesize = 20
clsrecordinfo.intpagenow = intpagenow
clsrecordinfo.strcookiesname = nombre d'enregistrements
clsrecordinfo.strpagevar = page
clsrecordinfo.intrefresh = 0
clsrecordinfo.objconn = conn
clsrecordinfo.initclass
arrrecordinfo = clsrecordinfo.arrrecordinfo
strpageinfo = clsrecordinfo.strpageinfo
setclsrecordinfo = rien
f__closeconn
%>
<html>
<tête>
<méta http-equiv=content-type content=text/html; charset=gb2312>
<title>Test de pagination</title>
<style type=text/css>
<!--
.pagevue {
taille de police : 12 px ;
}
.pageview td {
border-right-style : solide ;
border-bottom-style : solide ;
couleur de la bordure droite : #e0e0e0 ;
couleur de la bordure inférieure : #e0e0e0 ;
bordure-droite-largeur : 1px ;
bordure-bas-largeur : 1px ;
}
Tableau .pageview {
border-left-style : solide ;
style de bordure : solide ;
couleur de la bordure gauche : #e0e0e0 ;
couleur de la bordure supérieure : #e0e0e0 ;
largeur de bordure supérieure : 1 px ;
bordure-gauche-largeur : 1px ;
}
tr.en-tête {
arrière-plan : #eff7ff ;
taille de police : 14 px ;
poids de la police : gras ;
hauteur de ligne : 120 % ;
alignement du texte : centre ;
}
-->
</style>
<type de style=texte/css>
<!--
corps {
taille de police : 12 px ;
}
a:lien {
couleur : #993300 ;
décoration de texte : aucune ;
}
a: visité {
couleur : #003366 ;
décoration de texte : aucune ;
}
a: survolez {
couleur : #0066cc ;
décoration de texte : souligner ;
}
a:actif {
couleur : #000000 ;
décoration de texte : aucune ;
}
tableau {
taille de police : 12 px ;
}
-->
</style>
</tête>
<corps>
<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 classe=en-tête>
<td>identifiant</td>
<td>Description</td>
<td>Date</td>
</tr>
<%
si isarray (arrrecordinfo) alors
pour i = 0 vers ubound(arrrecordinfo, 2)
%>
<tr>
<td> <%= arrrecordinfo(0, i)%></td>
<td> <%= arrrecordinfo(1, i)%></td>
<td> <%= arrrecordinfo(2, i)%></td>
</tr>
<%
suivant
finir si
%>
</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>
</corps>
</html>