A idéia principal: usar uma instrução para contar (contar) o número de registros (em vez de obter o atributo RecordCount durante a consulta), armazená-lo em cookies e não precisar contar novamente ao pular. Use o atributo AbsolutePage do ADO para pular para o. Por conveniência Chamado e escrito como uma classe, as partes principais do código foram explicadas:
AMD Athlon XP 2600+, 256 DDR.
Ambiente de software: MS Windows 2000 Advanced Server + IIS 5.0 + Access 2000 + IE 6.0
Resultados do teste: O tempo de execução inicial é de 250 (página inicial) - 400 (última página) milissegundos, (após o número do registro ser armazenado em cache) o salto entre as páginas é estável em menos de 47 milissegundos. page não leva mais de 350 milissegundos.
Intervalo aplicável: Usado para paginação comum Não é adequado para consultas mais complexas: se a condição for "[Título] Como '%favorite%'", o tempo de consulta será bastante aumentado, mesmo que. o campo Título está indexado, será inútil :(.
< %@LANGUAGE = "VBScript" CODEPAGE="936"%>
<%Opção Explícita%>
<%
Dim intDateStart
intDateStart = Temporizador()
Rem ## Abrir conexão com banco de dados
Rem ############################################### ##############
função f__OpenConn()
Dim strDbPath
Dim connstr
strDbPath = "../db/test.mdb"
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Fonte de dados="
connstr = connstr & Server.MapPath(strDbPath)
Definir conexão = Server.CreateObject("Adodb.Connection")
conn.open connstr
Função final
Rem ############################################### ##############
Rem ## Fechar conexão com o banco de dados
Rem ############################################### ##############
função f__CloseConn()
Se IsObject(conn) Então
conexão.fechar
Terminar se
Definir conexão = nada
Função final
Rem ############################################### ##############
Rem obtém tempo de execução
Rem ############################################### ##############
função getTimeOver(iflag)
Dim tTimeOver
Se iflag = 1 Então
tTimeOver = FormatNumber(Timer() - intDateStart, 6, verdadeiro)
getTimeOver = "Tempo de execução: " & tTimeOver & " segundos"
Outro
tTimeOver = FormatNumber((Timer() - intDateStart) * 1000, 3, verdadeiro)
getTimeOver = "Tempo de execução: " & tTimeOver & " milissegundos"
Terminar se
Função final
Rem ############################################### ##############
Classe Cls_PageView
sbooInitState privado
SstrCookiesName privado
SstrPageUrl privado
SstrPageVar privado
SstrTableName privado
SstrFieldsList privado
SstrCondição privada
SstrOrderList privado
SstrPrimaryKey privada
SintRefresh privado
SintRecordCount privado
SintPageSize privado
SintPageNow privado
SintPageMax privado
Privado sobjConn
SstrPageInfo privado
Subclasse Privada_Initialize
Chame ClearVars()
Finalizar sub
Subclasse privada_terminate()
Definir sobjConn = nada
Finalizar sub
Sub ClearVars públicas()
sbooInitState = Falso
sstrCookiesNome = ""
sstrPageUrl = ""
sstrPageVar = "página"
sstrNomeTabela = ""
sstrFieldsList = ""
sstrCondição = ""
sstrOrderList = ""
sstrPrimaryKey = ""
sintRefresh = 0
sintRecordCount = 0
sintPageSize = 0
sintPageNow = 0
sintPageMax = 0
Finalizar sub
Rem ## Variável Cookies que salva o número de registros
Propriedade pública Let strCookiesName(Valor)
sstrCookiesName = Valor
Fim da propriedade
Rem ## endereço de redirecionamento
Propriedade pública Let strPageUrl(Value)
sstrPageUrl=Valor
Fim da propriedade
Rem ## nome da tabela
Propriedade pública Let strTableName(Valor)
sstrNomeTabela = Valor
Fim da propriedade
Lista de campos Rem ##
Propriedade pública Let strFieldsList(Valor)
sstrFieldsList = Valor
Fim da propriedade
Rem ## condições de consulta
Propriedade pública Let strCondiction(Valor)
Se Valor <> "" Então
sstrCondição = "ONDE" & Valor
Outro
sstrCondição = ""
Terminar se
Fim da propriedade
Rem ## Classificando campos, como: [ID] ASC, [CreateDateTime] DESC
Propriedade pública Let strOrderList(Value)
Se Valor <> "" Então
sstrOrderList = "ORDER BY" & Valor
Outro
sstrOrderList = ""
Terminar se
Fim da propriedade
Rem ## Campo utilizado para contar o número de registros
Propriedade pública Let strPrimaryKey(Value)
sstrPrimaryKey = Valor
Fim da propriedade
Rem ## O número de registros exibidos em cada página
Propriedade pública Let intPageSize(Value)
sintPageSize = toNum(Valor, 20)
Fim da propriedade
Rem ## Objeto de conexão de banco de dados
Propriedade pública Let objConn(Valor)
Definir sobjConn = Valor
Fim da propriedade
Rem ## Página atual
Propriedade pública Let intPageNow(Value)
sintPageNow = toNum(Valor, 1)
Fim da propriedade
Rem ## Parâmetros da página
Propriedade pública Let strPageVar(Value)
sstrPageVar = Valor
Fim da propriedade
Rem ## Se atualizar 1 significa atualizar, outros valores não são atualizados.
Propriedade pública Let intRefresh(Valor)
sintRefresh = toNum(Valor, 0)
Fim da propriedade
Rem ## Obtenha a página atual
Propriedade pública Obtenha intPageNow()
intPageNow = singPageNow
Fim da propriedade
Rem ## Informações de paginação
Propriedade pública Obtenha strPageInfo()
strPageInfo = sstrPageInfo
Fim da propriedade
Rem ## Para obter um conjunto de registros, array bidimensional ou string, você deve usar IsArray() para julgar ao executar a saída do loop.
Propriedade Pública Obter arrRecordInfo()
Se não for sbooInitState então
Sair da propriedade
Terminar se
Dim rs, sql
sql = "SELECT " & sstrFieldsList & _
"DE" & sstrTableName & _
sstrCondição&_
sstrOrderList
Definir rs = Server.CreateObject("Adodb.RecordSet")
rs.open sql, sobjConn, 1, 1
Se não (rs.eof ou rs.bof) então
rs.PageSize = sintPageSize
rs.AbsolutePage = sintPageNow
Se não (rs.eof ou rs.bof) então
arrRecordInfo = rs.getrows(sintPageSize)
Outro
arrRecordInfo = ""
Terminar se
Outro
arrRecordInfo = ""
Terminar se
rs.fechar
Defina rs = nada
Fim da propriedade
Rem ## Inicializa o número de registros
Sub InitRecordCount privado()
sintRecordCount = 0
Se não (sbooInitState), então saia do Sub
Dim sintTmp
sintTmp = toNum(request.Cookies("_xp_" & sstrCookiesName), -1)
Se ((sintTmp < 0) Ou (sintRefresh = 1))Então
Dim SQL,rs
sql = "SELECIONE CONTAGEM(" & sstrPrimaryKey & ")" & _
"DE" & sstrTableName & _
sstrCondição
Definir rs = sobjConn.execute(sql)
Se rs.eof ou rs.bof Então
sinTmp = 0
Outro
sinTmp = rs(0)
Terminar se
sintRecordCount = sintTmp
resposta.Cookies("_xp_" & sstrCookiesName) = sintTmp
Outro
sintRecordCount = sintTmp
Terminar se
Finalizar sub
Rem ## Inicializar informações de paginação
Sub Privado InitPageInfo()
sstrPageInfo = ""
Se não (sbooInitState), então saia do Sub
Sombrio
surl = sstrPageUrl
Se Instr(1, surl, "?", 1) > 0 Então
surl = surl & "&" & sstrPageVar & "="
Outro
surl = surl & "?" & sstrPageVar & "="
Terminar se
Se sintPageNow <= 0 Então sintPageNow = 1
Se sintRecordCount mod sintPageSize = 0 Então
sintPageMax = sintRecordCountsintPageSize
Outro
sintPageMax = sintRecordCount sintPageSize + 1
Terminar se
Se sintPageNow > sintPageMax Então sintPageNow = sintPageMax
Se sintPageNow <= 1 então
sstrPageInfo = "Página inicial da página anterior"
Outro
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & "1"">Home</a>"
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow - 1) & """>Página anterior</a>"
Terminar se
Se sintPageMax - sintPageNow <1 então
sstrPageInfo = sstrPageInfo & "Próxima página, última página"
Outro
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow + 1) & """>Próxima página</a> "
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & sintPageMax & """>Última página</a> "
Terminar se
sstrPageInfo = sstrPageInfo & "Página:<strong><font color=""#990000"">" & sintPageNow & "</font> / " & sintPageMax & " </strong>"
sstrPageInfo = sstrPageInfo & "Total<strong>" & sintRecordCount & "</strong>Record<strong>" & sintPageSize & "</strong>Record/Page"
Finalizar sub
Rem ## conversão de número inteiro longo
Função privada toNum(s, Padrão)
s = s & ""
Se s <> "" E IsNumeric(s) Então
toNum = CLng(s)
Outro
toNum = Padrão
Terminar se
Função final
Rem ## Inicialização da classe
SubInitClass pública()
sbooInitState = Verdadeiro
If Not(IsObject(sobjConn)) Then sbooInitState = False
CallInitRecordCount()
CallInitPageInfo()
Finalizar sub
Fim da aula
DimstrLocalUrl
strLocalUrl = request.ServerVariables("SCRIPT_NAME")
Escurecer intPageNow
intPageNow = request.QueryString("página")
Dim intPageSize, strPageInfo
intPageSize = 30
Dim arrRecordInfo, eu
Dim Conexão
f__OpenConn
Dim clsRecordInfo
Definir clsRecordInfo = Novo Cls_PageView
clsRecordInfo.strTableName = "[minhaTabela]"
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 = "Contagem de registros"
clsRecordInfo.strPageVar = "página"
clsRecordInfo.intRefresh = 0
clsRecordInfo.objConn = Conexão
clsRecordInfo.InitClass
arrRecordInfo = clsRecordInfo.arrRecordInfo
strPageInfo = clsRecordInfo.strPageInfo
Definir clsRecordInfo = nada
f__CloseConn
%>
<html>
<cabeça>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Teste de paginação</title>
<style type="texto/css">
<!--
.PageView {
tamanho da fonte: 12px;
}
.PageViewtd{
estilo borda direita: sólido;
estilo borda inferior: sólido;
cor da borda direita: #E0E0E0;
cor da borda inferior: #E0E0E0;
largura da borda à direita: 1px;
largura inferior da borda: 1px;
}
Tabela .PageView {
estilo borda esquerda: sólido;
estilo border-top: sólido;
cor da borda esquerda: #E0E0E0;
cor da borda superior: #E0E0E0;
largura superior da borda: 1px;
largura da borda esquerda: 1px;
}
tr.Cabeçalho {
plano de fundo: #EFF7FF;
tamanho da fonte: 14px;
peso da fonte: negrito;
altura da linha: 120%;
alinhamento de texto: centro;
}
-->
</estilo>
<style type="texto/css">
<!--
corpo {
tamanho da fonte: 12px;
}
a: link {
cor: #993300;
decoração de texto: nenhuma;
}
a:visitou {
cor: #003366;
decoração de texto: nenhuma;
}
a: passar o mouse {
cor: #0066CC;
decoração de texto: sublinhado;
}
a:ativo {
cor: #000000;
decoração de texto: nenhuma;
}
mesa {
tamanho da fonte: 12px;
}
-->
</estilo>
</head>
<corpo>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr>
<td> <%= strPageInfo%></td>
</tr>
</tabela>
<div class="PageView">
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr class="Cabeçalho">
<td>ID</td>
<td>Descrição</td>
<td>Data</td>
</tr>
<%
Se IsArray(arrRecordInfo) então
Para i = 0 para UBound(arrRecordInfo, 2)
%>
<tr>
<td> <%= arrRecordInfo(0, i)%></td>
<td> <%= arrRecordInfo(1, i)%></td>
<td> <%= arrRecordInfo(2, i)%></td>
</tr>
<%
Próximo
Terminar se
%>
</tabela>
</div>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr>
<td> <%= strPageInfo%></td>
</tr>
</tabela>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr>
<td align="center"> <%= getTimeOver(1)%></td>
</tr>
</tabela>
</body>
</html>