La idea principal: use una declaración para contar el número de registros (sin obtener el atributo recordcount durante la consulta), guárdelo en caché en las cookies y no es necesario volver a contar al saltar. Use el atributo de página absoluta de ado para saltar a la página. Por conveniencia Llamado y escrito como una clase, se han explicado las partes principales del código.
Entorno de hardware: AMD athlon xp 2600+, 256 ddr
Entorno de software: servidor avanzado ms windows 2000 + iis 5.0 + access 2000 + ie 6.0
Resultados de la prueba: el tiempo de ejecución inicial es de 250 (página de inicio) - 400 (última página) milisegundos (después de que el número de registro se almacena en caché), el salto entre páginas es estable en menos de 47 milisegundos. El salto desde la primera página a la última. La página no toma más de 350 milisegundos.
Ámbito de aplicación: se utiliza para paginación ordinaria. No es adecuado para consultas más complejas: si la condición es [título] como% favorito, el tiempo de consulta aumentará considerablemente, incluso si el campo de título está indexado, será inútil: (
<%@language = página de códigos vbscript=936%>
<%opción explícita%>
<%
inicio de fecha int tenue
intdatestart = temporizador()
rem ## Abrir conexión a la base de datos
remoto ################################################ # ###############
función f__openconn()
ruta de acceso tenue
conexión tenue
strdbpath = ../db/test.mdb
connstr = proveedor = microsoft.jet.oledb.4.0; fuente de datos =
connstr = connstr & server.mappath(strdbpath)
establecer conexión = servidor.createobject(adodb.conexión)
conn.open connstr
función final
remoto ################################################ # ###############
rem ## Cerrar conexión a la base de datos
remoto ################################################ # ###############
función f__closeconn()
si isobject(conn) entonces
con.cerrar
terminar si
establecer conexión = nada
función final
remoto ################################################ # ###############
rem obtiene tiempo de ejecución
remoto ################################################ # ###############
función gettimeover (iflag)
tiempo oscuro
si iflag = 1 entonces
ttimeover = número de formato (temporizador() - intdatestart, 6, verdadero)
gettimeover = tiempo de ejecución: & ttimeover & segundos
demás
ttimeover = número de formato ((temporizador() - intdatestart) * 1000, 3, verdadero)
gettimeover = tiempo de ejecución: & ttimeover & milisegundos
terminar si
función final
remoto ################################################ # ###############
clase cls_pageview
estado privado
nombre de cookies sstr privado
sstrpageurl privado
sstrpagevar privado
nombre de tabla sstr privado
lista de campos sstr privada
condición privada
lista de pasos privada
clave primaria sstr privada
sintrefresh privado
cuenta sintrecord privada
tamaño de página privado
sintpagenow privado
sintpagemax privado
conexión privada
información de página sstr privada
subclase privada_inicialización
llamar a clearvars()
sub final
subclase privada_terminar()
establecer sobjconn = nada
sub final
subclearvars públicos()
sbooinitstate = falso
nombredecookiessstr=
sstrpageurl=
sstrpagevar = página
nombretablasstr=
lista de campos sstr =
condición sstr =
lista de pasos =
sstrprimarykey=
sintrefresh=0
sintrecordcount = 0
sintpagesize=0
sintpagenow=0
sintpagemax=0
sub final
rem ## Variable de cookies que contiene el número de registros
propiedad pública let strcookiesname(valor)
sstrcookiesname = valor
propiedad final
rem ## dirección de redireccionamiento
propiedad pública let strpageurl(valor)
sstrpageurl = valor
propiedad final
rem ## nombre de la tabla
propiedad pública let strtablename(valor)
sstrtablename = valor
propiedad final
rem ## lista de campos
propiedad pública let strfieldslist(valor)
sstrfieldslist = valor
propiedad final
rem ## Condiciones de consulta
propiedad pública let strcondiction(valor)
si valor <> entonces
sstrcondiction = donde y valor
demás
condición sstr =
terminar si
propiedad final
rem ## Ordenar campos, como: [id] asc, [createdatetime] desc
propiedad pública let strorderlist(valor)
si valor <> entonces
sstrorderlist = ordenar por y valor
demás
lista de pasos =
terminar si
propiedad final
rem ## Campo utilizado para contar el número de registros
propiedad pública let strprimarykey(valor)
sstrprimarykey = valor
propiedad final
rem ## El número de registros que se muestran en cada página.
propiedad pública let intpagesize(valor)
sintpagesize = tonum(valor, 20)
propiedad final
rem ## Objeto de conexión de base de datos
propiedad pública let objconn(valor)
establecer sobjconn = valor
propiedad final
rem ## página actual
propiedad pública let intpagenow (valor)
sintpagenow = tonum(valor, 1)
propiedad final
rem ## parámetros de página
propiedad pública let strpagevar(valor)
sstrpagevar = valor
propiedad final
rem ## Si actualizar 1 significa actualizar, otros valores no se actualizan.
propiedad pública let intrefresh (valor)
sintrefresh = tonum(valor, 0)
propiedad final
rem ## Obtener la página actual
propiedad pública obtener intpagenow()
intpagenow = cantar ahora
propiedad final
rem ## Información de paginación
propiedad pública obtener strpageinfo()
strpageinfo = sstrpageinfo
propiedad final
rem ## Obtenga el conjunto de registros, matriz o cadena bidimensional, debe usar isarray() para juzgar al realizar la salida del bucle
propiedad pública obtener arrrecordinfo()
si no es sbooinitstate entonces
salir de la propiedad
terminar si
atenuadores, sql
sql = seleccionar & sstrfieldslist & _
de & sstrtablename & _
condición sstr&_
lista de estrorder
establecer rs = servidor.createobject(adodb.recordset)
rs.open sql, sobjconn, 1, 1
si no (rs.eof o rs.bof) entonces
rs.pagesize = sintpagesize
rs.absolutepage = sintpagenow
si no (rs.eof o rs.bof) entonces
arrrecordinfo = rs.getrows(sintpagesize)
demás
arrecordinfo=
terminar si
demás
arrecordinfo=
terminar si
rs.cerrar
setrs=nada
propiedad final
rem ## Inicializa el número de registros
sub privado initrecordcount()
sintrecordcount = 0
si no (sbooinitstate), entonces salga de sub
sintmp tenue
sinttmp = tonum(solicitud.cookies(_xp_ & sstrcookiesname), -1)
si ((sinttmp < 0) o (sintrefresh = 1)) entonces
sql oscuro, rs
sql = seleccionar recuento (& sstrprimarykey &) & _
de & sstrtablename & _
condición sstr
establecer rs = sobjconn.execute(sql)
si rs.eof o rs.bof entonces
sintmp = 0
demás
sintmp = rs(0)
terminar si
sintrecordcount = sinttmp
respuesta.cookies(_xp_ & sstrcookiesname) = sinttmp
demás
sintrecordcount = sinttmp
terminar si
sub final
rem ## Inicializar información de paginación
información de página de inicio secundaria privada ()
sstrpaginainfo=
si no (sbooinitstate), entonces salga de sub
surl oscuro
surl = sstrpageurl
si instr(1, surl, ?, 1) > 0 entonces
surl = surl & & & sstrpagevar & =
demás
surl = surl &?
terminar si
si sintpagenow <= 0 entonces sintpagenow = 1
si sintrecordcount mod sintpagesize = 0 entonces
sintpagemax = sintrecordcount\sintpagesize
demás
sintpagemax = sintrecordcount \ sintpagesize + 1
terminar si
si sintpagenow > sintpagemax entonces sintpagenow = sintpagemax
si sintpagenow <= 1 entonces
sstrpageinfo = Página de inicio página anterior
demás
sstrpageinfo = sstrpageinfo & <a href= & surl & 1>Página de inicio</a>
sstrpageinfo = sstrpageinfo & <a href= & surl & (sintpagenow - 1) & >Página anterior</a>
terminar si
si sintpagemax - sintpagenow < 1 entonces
sstrpageinfo = sstrpageinfo y página siguiente última página
demás
sstrpageinfo = sstrpageinfo & <a href= & surl & (sintpagenow + 1) & >página siguiente</a>
sstrpageinfo = sstrpageinfo & <a href= & surl & sintpagemax & >última página</a>
terminar si
sstrpageinfo = sstrpageinfo & página: <strong><font color=#990000> & sintpagenow & </font> / & sintpagemax & </strong>
sstrpageinfo = sstrpageinfo & total<strong> & sintrecordcount & </strong> registros<strong> & sintpagesize & </strong> registros/página
sub final
rem ## conversión de entero largo
tono(s) de función privada, predeterminado
s = s &
si s <> y es numérico(s) entonces
tono = clng(s)
demás
tono = predeterminado
terminar si
función final
rem ## Inicialización de clase
subclase de inicio pública()
sbooinitstate = verdadero
si no (isobject(sobjconn)) entonces sbooinitstate = false
llamar a initrecordcount()
llamar a initpageinfo()
sub final
clase final
tenue strlocalurl
strlocalurl = request.servervariables(script_name)
oscuro intpagenow
intpagenow = solicitud.querystring(página)
tenue intpagesize, strpageinfo
tamaño de página = 30
tenue arrrecordinfo, yo
conexión tenue
f__openconn
dimclsrecordinfo
establecer clsrecordinfo = nueva cls_pageview
clsrecordinfo.strtablename = [mitabla]
clsrecordinfo.strpageurl = strlocalurl
clsrecordinfo.strfieldslist = [id], [título], [última vez]
clsrecordinfo.strcondiction = [identificación] < 10000
clsrecordinfo.strorderlist = [id] asc
clsrecordinfo.strprimarykey = [identificación]
clsrecordinfo.inttamaño de página = 20
clsrecordinfo.intpagenow = intpagenow
clsrecordinfo.strcookiesname = recuento de registros
clsrecordinfo.strpagevar = página
clsrecordinfo.intrefresh = 0
clsrecordinfo.objconn = conexión
clsrecordinfo.initclass
arrrecordinfo = clsrecordinfo.arrrecordinfo
strpageinfo = clsrecordinfo.strpageinfo
setclsrecordinfo=nada
f__closeconn
%>
<html>
<cabeza>
<meta http-equiv=tipo de contenido contenido=text/html charset=gb2312>
<title>Prueba de paginación</title>
<tipo de estilo=texto/css>
<!--
.vista de página {
tamaño de fuente: 12px;
}
.página vista td {
estilo de borde derecho: sólido;
estilo de borde inferior: sólido;
color del borde derecho: #e0e0e0;
color-inferior-borde: #e0e0e0;
ancho del borde derecho: 1 px;
ancho del borde inferior: 1 px;
}
.tabla de vistas de página {
estilo de borde izquierdo: sólido;
estilo de borde superior: sólido;
color-borde-izquierdo: #e0e0e0;
color superior del borde: #e0e0e0;
ancho superior del borde: 1 px;
ancho del borde izquierdo: 1 px;
}
tr.encabezado {
fondo: #eff7ff;
tamaño de fuente: 14px;
peso de fuente: negrita;
altura de línea: 120%;
alineación de texto: centro;
}
-->
</estilo>
<tipo de estilo=texto/css>
<!--
cuerpo {
tamaño de fuente: 12px;
}
a: enlace {
color: #993300;
decoración de texto: ninguna;
}
a: visitado {
color: #003366;
decoración de texto: ninguna;
}
a: flotar {
color: #0066cc;
decoración de texto: subrayado;
}
a: activo {
color: #000000;
decoración de texto: ninguna;
}
mesa {
tamaño de fuente: 12px;
}
-->
</estilo>
</cabeza>
<cuerpo>
<ancho de tabla=100% borde=0 espacio entre celdas=0 relleno de celdas=4>
<tr>
<td><%= strpageinfo%></td>
</tr>
</tabla>
<div clase=vista de página>
<ancho de tabla=100% borde=0 espacio entre celdas=0 relleno de celdas=4>
<tr clase=encabezado>
<td>identificación</td>
<td>Descripción</td>
<td>Fecha</td>
</tr>
<%
si isarray(arrrecordinfo) entonces
para i = 0 a ubound(arrrecordinfo, 2)
%>
<tr>
<td> <%= arrrecordinfo(0, i)%></td>
<td> <%= arrrecordinfo(1, i)%></td>
<td> <%= arrrecordinfo(2, i)%></td>
</tr>
<%
próximo
terminar si
%>
</tabla>
</div>
<ancho de tabla=100% borde=0 espacio entre celdas=0 relleno de celdas=4>
<tr>
<td><%= strpageinfo%></td>
</tr>
</tabla>
<ancho de tabla=100% borde=0 espacio entre celdas=0 relleno de celdas=4>
<tr>
<td align=center> <%= gettimeover(1)%></td>
</tr>
</tabla>
</cuerpo>
</html>