Основная идея: использовать один оператор для подсчета количества записей (без получения атрибута 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] типа %favorite%, время запроса будет сильно увеличено, даже если поле заголовка будет проиндексировано, оно будет бесполезным: (
<%@language = кодовая страница vbscript=936%>
<%опция явный%>
<%
дим intdatestart
intdatestart = таймер()
rem ## Открыть соединение с базой данных
rem ############################################## ###############
функция f__openconn()
дим стрдбпуть
тусклый коннстр
стрдбпуть = ../db/test.mdb
connstr = поставщик=microsoft.jet.oledb.4.0;источник данных=
connstr = connstr & server.mappath(strdbpath)
set conn = server.createobject(adodb.connection)
conn.open connstr
конечная функция
rem ############################################## ###############
rem ## Закрыть соединение с базой данных
rem ############################################## ###############
функция f__closeconn()
если isobject(conn), то
конн.закрыть
конец, если
установить соединение = ничего
конечная функция
rem ############################################## ###############
rem получает время выполнения
rem ############################################## ###############
функция gettimeover(iflag)
тусклое время
если iflag = 1, то
ttimeover = formatnumber (timer() - intdatestart, 6, true)
gettimeover = время выполнения: & ttimeover & секунды
еще
ttimeover = formatnumber((timer() - intdatestart) * 1000, 3, true)
gettimeover = время выполнения: & ttimeover & миллисекунды
конец, если
конечная функция
rem ############################################## ###############
класс cls_pageview
частный sbooinitstate
личное имя sstrcookiesname
частный сстрпагерл
частный сстрпагевар
частное имя_таблицы
частный список полей
частная сстркондикция
частный список заказов
частный ключ sstrprimarykey
частный синтрефреш
частный синтрекордкаунт
частный
частная страница
частный синтпейджмакс
частный собджконн
частная информация о sstrpageinfo
частный подкласс_initialize
вызовите Clearvars()
конец субтитра
частный подкласс_terminate()
установить sobjconn = ничего
конец субтитра
публичные суб-clearvars()
sbooinitstate = ложь
sstrcookiesname=
sstrpageurl=
sstrpagevar = страница
sstrtablename=
sstrfieldslist =
sstrcondiction =
sstrorderlist =
sstrprimarykey=
синтрефреш=0
синтрекордсчет = 0
sintpagesize=0
sintpagenow=0
sintpagemax=0
конец субтитра
rem ## Переменная Cookies, содержащая количество записей
общедоступное свойство let strcookiesname(значение)
sstrcookiesname = значение
конечная собственность
rem ## адрес перенаправления
общедоступное свойство let strpageurl(значение)
sstrpageurl = значение
конечная собственность
rem ## имя таблицы
общедоступное свойство let strtablename(значение)
sstrtablename = значение
конечная собственность
rem ## список полей
общедоступное свойство let strfieldslist(значение)
sstrfieldslist = значение
конечная собственность
rem ## Условия запроса
публичное свойство let strcondiction(значение)
если значение <> тогда
sstrcondiction = где и значение
еще
sstrcondiction =
конец, если
конечная собственность
rem ## Поля сортировки, например: [id] по возрастанию, [createdatetime] по убыванию
публичное свойство let strorderlist(значение)
если значение <> тогда
sstrorderlist = упорядочить по и значению
еще
sstrorderlist =
конец, если
конечная собственность
rem ## Поле, используемое для подсчета количества записей
публичное свойство let strprimarykey(значение)
sstrprimarykey = значение
конечная собственность
rem ## Количество записей, отображаемых на каждой странице.
общедоступное свойство let intpagesize(значение)
sintpagesize = tonum (значение, 20)
конечная собственность
rem ## Объект подключения к базе данных
общественная собственность let objconn(значение)
установить sobjconn = значение
конечная собственность
rem ## текущая страница
общедоступная собственность let intpagenow (значение)
sintpagenow = tonum(значение, 1)
конечная собственность
rem ## параметры страницы
общедоступное свойство let strpagevar(значение)
sstrpagevar = значение
конечная собственность
rem ## Обновлять 1 означает обновление, другие значения не обновляются.
общественная собственность, пусть обновляется (значение)
sintrefresh = tonum(значение, 0)
конечная собственность
rem ## Получить текущую страницу
общедоступная собственность получить intpagenow()
intpagenow = Singpagenow
конечная собственность
rem ## Информация о нумерации страниц
общедоступная собственность получить strpageinfo()
strpageinfo = sstrpageinfo
конечная собственность
rem ## Получить набор записей, двумерный массив или строку. Вы должны использовать isarray() для оценки при выполнении вывода цикла
общественная собственность получает arrrecordinfo()
если не sbooinitstate, то
выход из собственности
конец, если
димрс, sql
sql = выберите & список полей sstr& _
из & имя_таблицы & _
сстркондикция&_
sstrorderlist
установите 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.закрыть
setrs=ничего
конечная собственность
rem ## Инициализировать количество записей
частный суб-initrecordcount()
синтрекордсчет = 0
если нет (sbooinitstate), то выйдите из sub
дим синттмп
sinttmp = tonum(request.cookies(_xp_ & sstrcookiesname), -1)
если ((sinttmp < 0) или (sintrefresh = 1))то
дим sql, rs
sql = выберите счетчик (& sstrprimarykey &) & _
из & имя_таблицы & _
сстркондикция
установите rs = sobjconn.execute(sql)
если rs.eof или rs.bof, то
синттмп = 0
еще
синттмп = rs(0)
конец, если
sintrecordcount = sinttmp
response.cookies(_xp_ & sstrcookiesname) = sinttmp
еще
sintrecordcount = sinttmp
конец, если
конец субтитра
rem ## Инициализировать информацию о подкачке
частная подпрограмма initpageinfo()
sstrpageinfo=
если нет (sbooinitstate), то выйдите из sub
тусклый звук
Surl = sstrpageurl
если instr(1, surl, ?, 1) > 0, то
surl = surl & & & sstrpagevar & =
еще
сурл = сурл & ? & сстрпагевар & =
конец, если
если sintpagenow <= 0, то sintpagenow = 1
если sintrecordcount mod sintpagesize = 0, то
sintpagemax = sintrecordcount\sintpagesize
еще
sintpagemax = sintrecordcount \ sintpagesize + 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> Records<strong> & sintpagesize & </strong> Records/page
конец субтитра
rem ## преобразование длинных целых чисел
тонум(ы) частной функции, по умолчанию
s = s &
если s <> и числовое(ые), то
тонум = clng(s)
еще
тонум = по умолчанию
конец, если
конечная функция
rem ## Инициализация класса
публичный подкласс инициализации()
sbooinitstate = правда
если нет(isobject(sobjconn)) то sbooinitstate = false
вызвать initrecordcount()
вызвать initpageinfo()
конец субтитра
конечный класс
дим стрлокалурл
strlocalurl = request.servervariables(script_name)
тусклый intpagenow
intpagenow = request.querystring(страница)
dim intpagesize, strpageinfo
intpagesize=30
dim arrrecordinfo, я
тусклый конн
f__openconn
dimclsrecordinfo
установить clsrecordinfo = новый cls_pageview
clsrecordinfo.strtablename = [моя таблица]
clsrecordinfo.strpageurl = strlocalurl
clsrecordinfo.strfieldslist = [id], [заголовок], [последний раз]
clsrecordinfo.strcondiction = [id] < 10000
clsrecordinfo.strorderlist = [id] по возрастанию
clsrecordinfo.strprimarykey = [id]
clsrecordinfo.intpagesize = 20
clsrecordinfo.intpagenow = intpagenow
clsrecordinfo.strcookiesname = количество записей
clsrecordinfo.strpagevar = страница
clsrecordinfo.intrefresh = 0
clsrecordinfo.objconn = подключение
clsrecordinfo.initclass
arrrecordinfo = clsrecordinfo.arrrecordinfo
strpageinfo = clsrecordinfo.strpageinfo
setclsrecordinfo=ничего
f__closeconn
%>
<html>
<голова>
<meta http-equiv=content-type content=text/html charset=gb2312>;
<title>Тест пейджинга</title>
<тип стиля=текст/css>
<!--
.pageview {
размер шрифта: 12 пикселей;
}
.pageview тд {
border-right-style: сплошной;
стиль границы-дна: сплошной;
правая граница цвета: #e0e0e0;
цвет нижней границы: #e0e0e0;
ширина границы справа: 1 пиксель;
ширина нижней границы: 1 пиксель;
}
Таблица .pageview {
стиль границы слева: сплошной;
border-top-style: сплошной;
цвет левой границы: #e0e0e0;
цвет верхней границы: #e0e0e0;
ширина верхней границы: 1 пиксель;
ширина левой границы: 1 пиксель;
}
tr.header {
фон: #eff7ff;
размер шрифта: 14 пикселей;
начертание шрифта: жирный;
высота строки: 120%;
выравнивание текста: по центру;
}
-->
</стиль>
<тип стиля=текст/css>
<!--
тело {
размер шрифта: 12 пикселей;
}
а: ссылка {
цвет: #993300;
текстовое оформление: нет;
}
а: посетил {
цвет: #003366;
текстовое оформление: нет;
}
а: наведите {
цвет: #0066cc;
оформление текста: подчеркивание;
}
а: активный {
цвет: #000000;
текстовое оформление: нет;
}
стол {
размер шрифта: 12 пикселей;
}
-->
</стиль>
</голова>
<тело>
<ширина таблицы=100% граница=0 cellpacing=0 cellpadding=4>
<тр>
<td> <%= strpageinfo%></td>
</tr>
</таблица>
<класс div=просмотр страницы>
<ширина таблицы=100% граница=0 cellpacing=0 cellpadding=4>
<tr класс=заголовок>
<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>
<ширина таблицы=100% граница=0 cellspaceing=0 cellpadding=4>
<тр>
<td> <%= strpageinfo%></td>
</tr>
</таблица>
<ширина таблицы=100% граница=0 cellspaceing=0 cellpadding=4>
<тр>
<td align=center> <%= gettimeover(1)%></td>
</tr>
</таблица>
</тело>
</html>