La idea principal: use una declaración para contar (Contar) el número de registros (en lugar de obtener el atributo RecordCount al realizar la consulta), almacenarlo en caché en Cookies y no es necesario volver a contar al saltar. Utilice el atributo AbsolutePage de ADO para saltar al. Para mayor comodidad, 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: MS Windows 2000 Advanced Server + 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 tarda más de 350 milisegundos.
Rango aplicable: se utiliza para paginación normal. 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 Título está indexado, será inútil :(
< %@LANGUAGE = "VBScript" CODEPAGE="936"%>
<%Opción explícita%>
<%
Dim intDateStart
intFechaInicio = Temporizador()
Rem ## Abrir conexión a la base de datos
Rem ############################################### ## ##############
función f__OpenConn()
Dim strDbPath
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 = Server.CreateObject("Adodb.Connection")
conn.open connstr
Función final
Rem ############################################### ## ##############
Rem ## Cerrar conexión a la base de datos
Rem ############################################### ## ##############
función f__CloseConn()
Si IsObject(conn) Entonces
con.cerrar
Terminar si
Establecer conexión = nada
Función final
Rem ############################################### ## ##############
Rem obtiene tiempo de ejecución
Rem ############################################### ## ##############
función getTimeOver(iflag)
Dim tTimeOver
Si iflag = 1 entonces
tTimeOver = FormatNumber(Timer() - intDateStart, 6, verdadero)
getTimeOver = "Tiempo de ejecución: " & tTimeOver & " segundos"
Demás
tTimeOver = FormatNumber((Timer() - intDateStart) * 1000, 3, verdadero)
getTimeOver = "Tiempo de ejecución: " & tTimeOver & " milisegundos "
Terminar si
Función final
Rem ############################################### ## ##############
Clase Cls_PageView
Estado sbooInit privado
Nombre de cookies sstr privado
URL de página sstr privada
sstrPageVar privado
Nombre de tabla sstr privada
Lista de campos sstr privados
Condición sstr privada
Lista de pedidos sstr privada
Clave primaria sstr privada
Sint privadoRefresh
SintRecordCount privado
Tamaño de página sint privada
SintPageNow privado
SintPageMax privado
Sollozo privado
Información de página sstr privada
Subclase privada_Inicializar
Llamar a ClearVars()
Subtítulo final
Subclase privada_terminar()
Establecer sobjConn = nada
Subtítulo final
Public Sub ClearVars()
sbooInitState = Falso
sstrCookiesName = ""
sstrPageUrl = ""
sstrPageVar = "página"
sstrTableName = ""
sstrFieldsList = ""
sstrCondiction = ""
sstrOrderList = ""
sstrPrimaryKey = ""
sintActualizar = 0
sintRecordCount = 0
tamaño de página sint = 0
sintPáginaAhora = 0
sintPáginaMax = 0
Subtítulo final
Rem ## Variable de cookies que guarda 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 = "DÓNDE" y valor
Demás
sstrCondiction = ""
Terminar si
Propiedad final
Rem ## Ordenar campos, como: [ID] ASC, [CreateDateTime] DESC
Propiedad pública Let strOrderList(Valor)
Si valor <> "" Entonces
sstrOrderList = "ORDENAR POR" & Valor
Demás
sstrOrderList = ""
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(Value)
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 = cantarPáginaAhora
Propiedad final
Rem ## Información de paginación
Propiedad pública Obtener strPageInfo()
strPageInfo = sstrPageInfo
Propiedad final
Rem ## Para obtener un conjunto de registros, una matriz bidimensional o una cadena, 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
rs tenues, sql
sql = "SELECCIONAR " & sstrFieldsList & _
" DE " & sstrTableName & _
sstrCondición&_
sstrListaDePedidos
Establecer rs = Server.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
arrRecordInfo = ""
Terminar si
Demás
arrRecordInfo = ""
Terminar si
rs.cerrar
Establecer rs = nada
Propiedad final
Rem ## Inicializar el número de registros
Sub privado InitRecordCount()
sintRecordCount = 0
Si no (sbooInitState), salga de Sub
Dim sintTmp
sintTmp = toNum(solicitud.Cookies("_xp_" & sstrCookiesName), -1)
Si ((sintTmp < 0) o (sintRefresh = 1)) entonces
sql oscuro, rs
sql = "SELECCIONAR CUENTA(" & sstrPrimaryKey & ")" & _
" DE " & sstrTableName & _
sstrCondición
Establecer rs = sobjConn.execute(sql)
Si rs.eof o rs.bof Entonces
sintTmp = 0
Demás
sintTmp = rs(0)
Terminar si
sintRecordCount = sintTmp
respuesta.Cookies("_xp_" & sstrCookiesName) = sintTmp
Demás
sintRecordCount = sintTmp
Terminar si
Subtítulo final
Rem ## Inicializar información de paginación
Información de página de inicio secundaria privada ()
sstrPageInfo = ""
Si no (sbooInitState), salga de Sub
Surl oscuro
surl = sstrPageUrl
Si Instr(1, surl, "?", 1) > 0 Entonces
surl = surl & "&" & sstrPageVar & "="
Demás
surl = surl & "?" & sstrPageVar & "="
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"">Inicio</a>"
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow - 1) & """>Página anterior</a>"
Terminar si
Si sintPageMax - sintPageNow < 1 entonces
sstrPageInfo = sstrPageInfo & "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>Record<strong>" & sintPageSize & "</strong>Registro/Página"
Subtítulo final
Rem ## conversión de entero largo
Función privada paraNum(s, predeterminado)
s = s y ""
Si s <> "" y IsNumeric(s) entonces
toNum = CLng(s)
Demás
toNum = 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
CallInitRecordCount()
CallInitPageInfo()
Subtítulo final
Fin de clase
Dim strLocalUrl
strLocalUrl = solicitud.ServerVariables("SCRIPT_NAME")
Dim intPageNow
intPageNow = request.QueryString("página")
Dim intPageSize, strPageInfo
intPageSize = 30
Dim arrRecordInfo, yo
Dim Conn
f__OpenConn
Dim clsRecordInfo
Establecer clsRecordInfo = Nuevo Cls_PageView
clsRecordInfo.strTableName = "[miTabla]"
clsRecordInfo.strPageUrl = strLocalUrl
clsRecordInfo.strFieldsList = "[ID], [Título], [Última hora]"
clsRecordInfo.strCondiction = "[ID] < 10000"
clsRecordInfo.strOrderList = "[ID] ASC"
clsRecordInfo.strPrimaryKey = "[ID]"
clsRecordInfo.intPageSize = 20
clsRecordInfo.intPageNow = intPageNow
clsRecordInfo.strCookiesName = "RecordCount"
clsRecordInfo.strPageVar = "página"
clsRecordInfo.intRefresh = 0
clsRecordInfo.objConn = Conexión
clsRecordInfo.InitClass
arrRecordInfo = clsRecordInfo.arrRecordInfo
strPageInfo = clsRecordInfo.strPageInfo
Establecer clsRecordInfo = nada
f__CerrarConn
%>
<html>
<cabeza>
<meta http-equiv="Tipo de contenido" content="text/html; charset=gb2312">
<title>Prueba de paginación</title>
<tipo de estilo="texto/css">
<!--
.Vista de página {
tamaño de fuente: 12px;
}
.PageView 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;
}
.PageView tabla {
estilo de borde izquierdo: sólido;
estilo de borde superior: sólido;
color del borde izquierdo: #E0E0E0;
color del borde superior: #E0E0E0;
ancho superior del borde: 1 px;
ancho del borde izquierdo: 1 px;
}
tr.Encabezado {
antecedentes: #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>
<table width="100%" border="0" cellspace="0" cellpadding="4">
<tr>
<td><%= strPageInfo%></td>
</tr>
</tabla>
<div class="Vista de página">
<table width="100%" border="0" cellspace="0" cellpadding="4">
<tr clase="Encabezado">
<td>ID</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>
<table width="100%" border="0" cellspace="0" cellpadding="4">
<tr>
<td><%= strPageInfo%></td>
</tr>
</tabla>
<table width="100%" border="0" cellspace="0" cellpadding="4">
<tr>
<td align="center"> <%= getTimeOver(1)%></td>
</tr>
</tabla>
</cuerpo>
</html>