L'idée principale : utilisez une instruction pour compter (Compter) le nombre d'enregistrements (au lieu d'obtenir l'attribut RecordCount lors de l'interrogation), mettez-le 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 à l'attribut AbsolutePage d'ADO. 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.
Plage applicable : Utilisée 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é, cela ne servira à rien :(
< %@LANGUAGE = "VBScript" CODEPAGE="936"%>
<%Option explicite%>
<%
Dim intDateDébut
intDateStart = Minuterie()
Rem ## Ouvrir la connexion à la base de données
Rem ############################################## ## ##############
fonction f__OpenConn()
Faible strDbPath
Constr.
strDbPath = "../db/test.mdb"
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Source de données="
connstr = connstr & Server.MapPath(strDbPath)
Définir conn = Server.CreateObject("Adodb.Connection")
conn.open connstr
Fin de fonction
Rem ############################################## ## ##############
Rem ## Fermer la connexion à la base de données
Rem ############################################## ## ##############
fonction f__CloseConn()
Si IsObject(conn) Alors
connexion.fermer
Fin si
Définir conn = rien
Fin de fonction
Rem ############################################## ## ##############
Rem obtient le temps d'exécution
Rem ############################################## ## ##############
fonction getTimeOver (iflag)
Dim tTimeOver
Si iflag = 1 Alors
tTimeOver = FormatNumber(Timer() - intDateStart, 6, vrai)
getTimeOver = "Durée d'exécution : " & tTimeOver & " secondes"
Autre
tTimeOver = FormatNumber((Timer() - intDateStart) * 1000, 3, vrai)
getTimeOver = "Durée d'exécution : " & tTimeOver & " millisecondes"
Fin si
Fin de fonction
Rem ############################################## ## ##############
Classe Cls_PageView
sbooInitState privé
Nom sstrCookies privé
URL de page sstr privée
sstrPageVar privée
Nom de la table sstr privée
Liste sstrFields privée
sstrCondiction privée
Liste de commandes privée
Clé privée sstrPrimaryKey
Sint privéRefresh
SintRecordCount privé
SintPageSize privé
SintPageNow privé
SintPageMax privé
SobjConn privé
sstrPageInfo privée
Sous-classe privée_Initialize
Appelez ClearVars()
Fin du sous-marin
Sous-classe privée_terminate()
Définir sobjConn = rien
Fin du sous-marin
Sous-ClearVars publics()
sbooInitState = Faux
sstrCookiesName = ""
sstrPageUrl = ""
sstrVarPage = "page"
sstrTableName = ""
sstrFieldsList = ""
sstrCondiction = ""
sstrOrderList = ""
sstrPrimaryKey = ""
sintRefresh = 0
sintRecordCount = 0
sintPageSize = 0
sintPageNow = 0
sintPageMax = 0
Fin du sous-marin
Rem ## Variable de cookies qui enregistre le nombre d'enregistrements
Propriété publique Let strCookiesName(Value)
sstrCookiesName = Valeur
Propriété de fin
Rem ## adresse de redirection
Propriété publique Let strPageUrl (Valeur)
sstrPageUrl=Valeur
Propriété de fin
Rem ## nom de la table
Propriété publique Let strTableName(Value)
sstrTableName = Valeur
Propriété de fin
Liste des champs Rem ##
Propriété publique Let strFieldsList(Value)
sstrFieldsList = Valeur
Propriété de fin
Conditions de requête Rem ##
Propriété publique Let strCondiction (Valeur)
Si Valeur <> "" Alors
sstrCondiction = " OÙ " & Valeur
Autre
sstrCondiction = ""
Fin si
Propriété de fin
Rem ## Tri des champs, tels que : [ID] ASC, [CreateDateTime] DESC
Propriété publique Let strOrderList(Value)
Si Valeur <> "" Alors
sstrOrderList = " ORDER BY " & Valeur
Autre
sstrOrderList = ""
Fin si
Propriété de fin
Rem ## Champ utilisé pour compter le nombre d'enregistrements
Propriété publique Let strPrimaryKey(Value)
sstrPrimaryKey = Valeur
Propriété de fin
Rem ## Le nombre d'enregistrements affichés sur chaque page
Propriété publique Let intPageSize (Valeur)
sintPageSize = toNum (Valeur, 20)
Propriété de fin
Rem ## Objet de connexion à la base de données
Propriété publique Let objConn (Valeur)
Définir sobjConn = Valeur
Propriété de fin
Rem ## Page actuelle
Propriété publique Let intPageNow (Valeur)
sintPageNow = toNum (Valeur, 1)
Propriété de fin
Rem ## Paramètres de la page
Propriété publique Let strPageVar(Value)
sstrPageVar = Valeur
Propriété de fin
Rem ## S'il faut actualiser. 1 signifie actualiser, les autres valeurs ne sont pas actualisées.
Propriété publique Let intRefresh (Valeur)
sintRefresh = toNum (Valeur, 0)
Propriété de fin
Rem ## Récupérer la page actuelle
Propriété publique Obtenir intPageNow()
intPageNow = chanterPageNow
Propriété de fin
Rem ## Informations sur la pagination
Propriété publique Obtenir strPageInfo()
strPageInfo = sstrPageInfo
Propriété de fin
Rem ## Pour obtenir un 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()
Si ce n'est pas le cas, sbooInitState, alors
Quitter la propriété
Fin si
Dim rs, sql
sql = "SELECT" & sstrFieldsList & _
" FROM " & sstrTableName & _
sstrCondiction&_
sstrOrderList
Définir rs = Server.CreateObject("Adodb.RecordSet")
rs.open sql, sobjConn, 1, 1
Si non (rs.eof ou rs.bof) Alors
rs.PageSize = sintPageSize
rs.AbsolutePage = sintPageNow
Si non (rs.eof ou rs.bof) Alors
arrRecordInfo = rs.getrows(sintPageSize)
Autre
arrRecordInfo = ""
Fin si
Autre
arrRecordInfo = ""
Fin si
rs.fermer
Définir rs = rien
Propriété de fin
Rem ## Initialiser le nombre d'enregistrements
Sous-privé InitRecordCount()
sintRecordCount = 0
Si ce n'est pas le cas (sbooInitState), alors quittez Sub
Dim sintTmp
sintTmp = toNum(request.Cookies("_xp_" & sstrCookiesName), -1)
Si ((sintTmp < 0) Ou (sintRefresh = 1))Alors
Dim sql, rs
sql = "SELECT COUNT(" & sstrPrimaryKey & ")" & _
" FROM " & sstrTableName & _
sstrCondiction
Définir rs = sobjConn.execute(sql)
Si rs.eof ou rs.bof Alors
sintTmp = 0
Autre
sintTmp = rs(0)
Fin si
sintRecordCount = sintTmp
réponse.Cookies("_xp_" & sstrCookiesName) = sintTmp
Autre
sintRecordCount = sintTmp
Fin si
Fin du sous-marin
Rem ## Initialiser les informations de pagination
Sous-InitPageInfo privé()
sstrPageInfo = ""
Si ce n'est pas le cas (sbooInitState), alors quittez Sub
Dim surl
surl = sstrPageUrl
Si Instr(1, surl, "?", 1) > 0 Alors
surl = surl & "&" & sstrPageVar & "="
Autre
surl = surl & "?" & sstrVarPage & "="
Fin si
Si sintPageNow <= 0 Alors sintPageNow = 1
Si sintRecordCount mod sintPageSize = 0 Alors
sintPageMax = sintRecordCount sintPageSize
Autre
sintPageMax = sintRecordCount sintPageSize + 1
Fin 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"">Accueil</a>"
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow - 1) & """>Page précédente</a>"
Fin 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> "
Fin si
sstrPageInfo = sstrPageInfo & "Page :<strong><font color=""#990000"">" & sintPageNow & "</font> / " & sintPageMax & " </strong>"
sstrPageInfo = sstrPageInfo & "Total<strong>" & sintRecordCount & "</strong>Record<strong>" & sintPageSize & "</strong>Record/Page"
Fin du sous-marin
Rem ## conversion d'entier long
Fonction privée toNum(s, par défaut)
s = s & ""
Si s <> "" Et EstNumérique(s) Alors
toNum = CLng(s)
Autre
toNum = Par défaut
Fin si
Fin de fonction
Rem ## Initialisation de la classe
Sous-classe d'initialisation publique()
sbooInitState = Vrai
Si non (IsObject (sobjConn)) Alors sbooInitState = False
CallInitRecordCount()
AppelInitPageInfo()
Fin du sous-marin
Fin du cours
Dim strLocalUrl
strLocalUrl = request.ServerVariables("SCRIPT_NAME")
Dim intPageNow
intPageNow = request.QueryString("page")
Dim intPageSize, strPageInfo
intPageSize = 30
Dim arrRecordInfo, je
Dim Conn
f__OpenConn
Dim clsRecordInfo
Définir clsRecordInfo = Nouveau Cls_PageView
clsRecordInfo.strTableName = "[maTable]"
clsRecordInfo.strPageUrl = strLocalUrl
clsRecordInfo.strFieldsList = "[ID], [Titre], [LastTime]"
clsRecordInfo.strCondiction = "[ID] < 10 000"
clsRecordInfo.strOrderList = "[ID] ASC"
clsRecordInfo.strPrimaryKey = "[ID]"
clsRecordInfo.intPageSize = 20
clsRecordInfo.intPageNow = intPageNow
clsRecordInfo.strCookiesName = "RecordCount"
clsRecordInfo.strPageVar = "page"
clsRecordInfo.intRefresh = 0
clsRecordInfo.objConn = Conn
clsRecordInfo.InitClass
arrRecordInfo = clsRecordInfo.arrRecordInfo
strPageInfo = clsRecordInfo.strPageInfo
Définir clsRecordInfo = rien
f__FermerConn
%>
<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>
<style type="text/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 class="En-tête">
<td>ID</td>
<td>Description</td>
<td>Date</td>
</tr>
<%
Si IsArray(arrRecordInfo) Alors
Pour i = 0 à UBound(arrRecordInfo, 2)
%>
<tr>
<td> <%= arrRecordInfo(0, i)%></td>
<td> <%= arrRecordInfo(1, i)%></td>
<td> <%= arrRecordInfo(2, i)%></td>
</tr>
<%
Suivant
Fin 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>