Основная идея: использовать один оператор для подсчета (Count) количества записей (вместо получения атрибута RecordCount при запросе), кэшировать его в файлах cookie и не выполнять повторный подсчет при переходе. Используйте атрибут AbsolutePage ADO для перехода к элементу. Для удобства основные части кода вызваны и записаны в виде класса
: AMD Athlon XP 2600+, 256 DDR.
Программная среда: MS Windows 2000 Advanced Server + IIS 5.0 + Access 2000 + IE 6.0.
Результаты теста: Начальное время выполнения составляет 250 (домашняя страница) - 400 (последняя страница) миллисекунд, (после кэширования номера записи) переход между страницами стабильно составляет менее 47 миллисекунд. Переход с первой страницы на последнюю. страница не занимает более 350 миллисекунд.
Применимый диапазон: используется для обычного пейджинга. Не подходит для более сложных запросов: если условие «[Title] Like '%favorite%'», время запроса будет значительно увеличено, даже если. поле Title проиндексировано, оно будет бесполезным :(
< %@LANGUAGE = "VBScript" CODEPAGE="936"%>
<%Явный вариант%>
<%
Dim intDateStart
intDateStart = Таймер()
Rem ## Открыть соединение с базой данных
Рем ############################################## ##############
функция f__OpenConn()
Тусклый стрдбпас
Тусклый контакт
strDbPath = "../db/test.mdb"
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Источник данных="
connstr = connstr & Server.MapPath(strDbPath)
Установить conn = Server.CreateObject("Adodb.Connection")
conn.open connstr
Конечная функция
Рем ############################################## ##############
Rem ## Закрыть соединение с базой данных
Рем ############################################## ##############
функция f__CloseConn()
Если IsObject(conn) Тогда
конн.закрыть
Конец, если
Установить соединение = ничего
Конечная функция
Рем ############################################## ##############
Рем получает время казни
Рем ############################################## ##############
функция getTimeOver(iflag)
Тусклый tTimeOver
Если iflag = 1 Тогда
tTimeOver = FormatNumber(Timer() - intDateStart, 6, true)
getTimeOver = "Время выполнения: " & tTimeOver & " секунд"
Еще
tTimeOver = FormatNumber((Timer() - intDateStart) * 1000, 3, правда)
getTimeOver = "Время выполнения: " & tTimeOver & " миллисекунды"
Конец, если
Конечная функция
Рем ############################################## ##############
Класс Cls_PageView
Частное sbooInitState
Частное имя sstrCookiesName
Частный sstrPageUrl
Частный сстрпажевар
Частное имя_sstrTableName
Частный список сстрфилдслист
Частное sstrCondiction
Частный сстрордерлист
Частный sstrPrimaryKey
Частный синтОбновить
Частный sintRecordCount
Частный синтпажесизе
Частный sintPageNow
Частный синтпейджмакс
Частный собджконн
Частный сстрпажеинфо
Частный подкласс_инициализировать
Вызов ClearVars()
Конец субтитра
Частный подкласс_terminate()
Установить sobjConn = ничего
Конец субтитра
Публичная подпрограмма ClearVars()
sbooInitState = Ложь
sstrCookiesName = ""
сстрпажеурл = ""
sstrPageVar = "страница"
sstrTableName = ""
sstrFieldsList = ""
сстрКондиктион = ""
сстрордерлист = ""
sstrPrimaryKey = ""
синтРефреш = 0
синтрекордкаунт = 0
синтпажесизе = 0
синтпаженоу = 0
синтпажемакс = 0
Конец субтитра
Rem ## Переменная Cookies, сохраняющая количество записей
Открытое свойство Let strCookiesName(значение)
sstrCookiesName = Значение
Конечная собственность
Rem ## адрес перенаправления
Открытое свойство Let strPageUrl(Value)
sstrPageUrl=Значение
Конечная собственность
Rem ## имя таблицы
Открытое свойство Let strTableName(Value)
sstrTableName = Значение
Конечная собственность
Список полей Rem ##
Открытое свойство Let strFieldsList(Value)
sstrFieldsList = Значение
Конечная собственность
Удалить ## условия запроса
Открытое свойство Let strCondiction(Value)
Если Значение <> "" Тогда
sstrCondiction = «ГДЕ» и значение
Еще
сстрКондикция = ""
Конец, если
Конечная собственность
Rem ## Поля сортировки, например: [ID] ASC, [CreateDateTime] DESC
Открытое свойство Let strOrderList(Value)
Если Значение <> "" Тогда
sstrOrderList = "ORDER BY" и значение
Еще
сстрордерлист = ""
Конец, если
Конечная собственность
Rem ## Поле, используемое для подсчета количества записей.
Открытое свойство Let strPrimaryKey(Value)
sstrPrimaryKey = Значение
Конечная собственность
Rem ## Количество записей, отображаемых на каждой странице.
Открытое свойство Let intPageSize(Value)
sintPageSize = toNum (значение, 20)
Конечная собственность
Rem ## Объект подключения к базе данных
Открытая собственность Let objConn(Value)
Установите sobjConn = Значение
Конечная собственность
Рем ## Текущая страница
Открытое свойство Let intPageNow(Value)
sintPageNow = toNum (значение, 1)
Конечная собственность
Rem ## Параметры страницы
Открытое свойство Let strPageVar(Value)
сстрпажевар = значение
Конечная собственность
Rem ## Обновлять 1 означает обновление, другие значения не обновляются.
Открытое свойство Let intRefresh(Value)
sintRefresh = toNum (значение, 0)
Конечная собственность
Rem ## Получить текущую страницу
Открытая собственность Получить intPageNow()
intPageNow = SingPageNow
Конечная собственность
Rem ## Информация о нумерации страниц
Открытая собственность Получить strPageInfo()
стрпажеинфо = сстрпажеинфо
Конечная собственность
Rem ## Чтобы получить набор записей, двумерный массив или строку, вы должны использовать IsArray() для оценки выполнения вывода цикла.
Открытая собственность Получить arrRecordInfo()
Если Не sbooInitState Тогда
Выход из свойства
Конец, если
Дим rs, sql
sql = "ВЫБРАТЬ" & sstrFieldsList & _
«ОТ» & sstrTableName & _
sstrCondiction&_
сстрордерлист
Установите rs = Server.CreateObject("Adodb.RecordSet")
rs.open sql, sobjConn, 1, 1
Если нет(rs.eof или rs.bof) Тогда
rs.PageSize = sintPageSize
rs.AbsolutePage = sintPageNow
Если нет(rs.eof или rs.bof) Тогда
arrRecordInfo = rs.getrows(sintPageSize)
Еще
arrRecordInfo = ""
Конец, если
Еще
arrRecordInfo = ""
Конец, если
RS.закрыть
Установить rs = ничего
Конечная собственность
Rem ## Инициализировать количество записей
Частная подпрограмма InitRecordCount()
синтрекордкаунт = 0
Если нет (sbooInitState), то выйдите из Sub.
Тусклый синтTmp
sintTmp = toNum(request.Cookies("_xp_" & sstrCookiesName), -1)
Если ((sintTmp < 0) Или (sintRefresh = 1))Тогда
Дим sql, rs
sql = "SELECT COUNT(" & sstrPrimaryKey & ")" & _
«ОТ» & sstrTableName & _
sstrCondiction
Установите rs = sobjConn.execute(sql)
Если rs.eof или rs.bof Тогда
синтТмп = 0
Еще
sintTmp = rs(0)
Конец, если
sintRecordCount = sintTmp
response.Cookies("_xp_" & sstrCookiesName) = sintTmp
Еще
sintRecordCount = sintTmp
Конец, если
Конец субтитра
Rem ## Инициализировать информацию о подкачке
Частная подписка InitPageInfo()
сстрпажеинфо = ""
Если нет (sbooInitState), то выйдите из Sub.
Тусклый звук
Surl = sstrPageUrl
Если Instr(1, surl, "?", 1) > 0 Тогда
surl = surl & "&" & sstrPageVar & "="
Еще
surl = surl & "?" & sstrPageVar & "="
Конец, если
Если sintPageNow <= 0 Тогда sintPageNow = 1
Если sintRecordCount mod sintPageSize = 0 Тогда
sintPageMax = sintRecordCountsintPageSize
Еще
sintPageMax = sintRecordCountsintPageSize + 1
Конец, если
Если sintPageNow > sintPageMax Тогда sintPageNow = sintPageMax
Если sintPageNow <= 1, то
sstrPageInfo = "Главная страница, предыдущая страница"
Еще
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & "1"">Главная</a>"
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow - 1) & """>Предыдущая страница</a>"
Конец, если
Если sintPageMax - sintPageNow < 1, то
sstrPageInfo = sstrPageInfo & «Следующая страница, последняя страница»
Еще
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow + 1) & """>Следующая страница</a> "
sstrPageInfo = sstrPageInfo & " <a href=""" & surl & sintPageMax & """>Последняя страница</a> "
Конец, если
sstrPageInfo = sstrPageInfo & "Page:<strong><font color=""#990000"">" & sintPageNow & "</font> / " & sintPageMax & " </strong>"
sstrPageInfo = sstrPageInfo & "Total<strong>" & sintRecordCount & "</strong>Record<strong>" & sintPageSize & "</strong>Record/Page"
Конец субтитра
Rem ## преобразование длинных целых чисел
Частная функция toNum(s, по умолчанию)
s = s & ""
Если s <> "" и IsNumeric(s) Тогда
toNum = CLng(s)
Еще
toNum = По умолчанию
Конец, если
Конечная функция
Rem ## Инициализация класса
Публичный субиниткласс()
сбуинитстате = Истина
Если нет(IsObject(sobjConn)) Тогда sbooInitState = False
ВызовИнитРекордКаунт()
ВызовИнитПажеИнфо()
Конец субтитра
Конечный класс
Dim strLocalUrl
strLocalUrl = request.ServerVariables("SCRIPT_NAME")
Dim intPageNow
intPageNow = request.QueryString("страница")
Dim intPageSize, strPageInfo
интпажесизе = 30
Dim arrRecordInfo, я
Дим Конн
f__OpenConn
Dim clsRecordInfo
Установите clsRecordInfo = New Cls_PageView.
clsRecordInfo.strTableName = "[myTable]"
clsRecordInfo.strPageUrl = strLocalUrl
clsRecordInfo.strFieldsList = "[ID], [Название], [LastTime]"
clsRecordInfo.strCondiction = "[ID] < 10000"
clsRecordInfo.strOrderList = "[ID] ASC"
clsRecordInfo.strPrimaryKey = "[ID]"
clsRecordInfo.intPageSize = 20
clsRecordInfo.intPageNow = intPageNow
clsRecordInfo.strCookiesName = "RecordCount"
clsRecordInfo.strPageVar = "страница"
clsRecordInfo.intRefresh = 0
clsRecordInfo.objConn = Соединение
clsRecordInfo.InitClass
arrRecordInfo = clsRecordInfo.arrRecordInfo
стрпажеинфо = clsRecordInfo.strPageInfo
Установить clsRecordInfo = ничего
f__CloseConn
%>
<html>
<голова>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Тест пейджинга</title>
<style type="text/css">
<!--
.PageView {
размер шрифта: 12 пикселей;
}
.PageView тд {
border-right-style: сплошной;
стиль границы-дна: сплошной;
цвет границы справа: #E0E0E0;
цвет нижней границы: #E0E0E0;
ширина границы справа: 1 пиксель;
ширина нижней границы: 1 пиксель;
}
Таблица .PageView {
стиль границы слева: сплошной;
border-top-style: сплошной;
цвет левой границы: #E0E0E0;
цвет верхней границы: #E0E0E0;
ширина верхней границы: 1 пиксель;
ширина левой границы: 1 пиксель;
}
tr.Header {
фон: #EFF7FF;
размер шрифта: 14 пикселей;
начертание шрифта: жирный;
высота строки: 120%;
выравнивание текста: по центру;
}
-->
</стиль>
<style type="text/css">
<!--
тело {
размер шрифта: 12 пикселей;
}
а: ссылка {
цвет: #993300;
текстовое оформление: нет;
}
а: посетил {
цвет: #003366;
текстовое оформление: нет;
}
а: наведите {
цвет: #0066CC;
оформление текста: подчеркивание;
}
а: активный {
цвет: #000000;
текстовое оформление: нет;
}
стол {
размер шрифта: 12 пикселей;
}
-->
</стиль>
</голова>
<тело>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<тр>
<td> <%= strPageInfo%></td>
</tr>
</таблица>
<div class="Просмотр страницы">
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr class="Заголовок">
<td>Идентификатор</td>
<td>Описание</td>
<td>Дата</td>
</tr>
<%
Если IsArray(arrRecordInfo) Тогда
Для i = 0 до UBound(arrRecordInfo, 2)
%>
<тр>
<td> <%= arrRecordInfo(0, i)%></td>
<td> <%= arrRecordInfo(1, i)%></td>
<td> <%= arrRecordInfo(2, i)%></td>
</tr>
<%
Следующий
Конец, если
%>
</таблица>
</div>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<тр>
<td> <%= strPageInfo%></td>
</tr>
</таблица>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<тр>
<td align="center"> <%= getTimeOver(1)%></td>
</tr>
</таблица>
</тело>
</html>