주요 아이디어: 하나의 문을 사용하여 레코드 수를 계산하고(쿼리 중 Recordcount 속성을 얻지 않고) 이를 쿠키에 캐시하며, 페이지로 이동하려면 ado의 절대 페이지 속성을 사용합니다. 편의상 클래스로 호출하여 작성하였으며, 코드의 주요 부분을 설명하였습니다.
하드웨어 환경: amd athlon xp 2600+, 256 ddr
소프트웨어 환경: ms windows 2000 Advanced server + iis 5.0 + access 2000 + ie 6.0
테스트 결과: 초기 실행 시간은 250(홈 페이지) - 400(마지막 페이지) 밀리초입니다. (레코드 번호가 캐시된 후) 페이지 간 점프는 첫 번째 페이지에서 마지막 페이지까지의 점프가 47밀리초 미만으로 안정적입니다. 페이지는 350밀리초 이상 걸리지 않습니다.
적용 범위: 일반 페이징에 사용됩니다. 더 복잡한 쿼리에는 적합하지 않습니다. 조건이 %favorite%와 같이 [제목]이면 쿼리 시간이 크게 늘어나며 제목 필드가 색인화되어 있어도 쓸모가 없습니다. (
<%@언어 = vbscript 코드페이지=936%>
<%옵션 명시%>
<%
희미한 날짜 시작
intdatestart = 타이머()
rem ## 데이터베이스 연결 열기
렘 ########################################### # ###############
함수 f__openconn()
희미한 strdbpath
희미한 연결
strdbpath = ../db/test.mdb
connstr = 공급자=microsoft.jet.oledb.4.0;데이터 소스=
connstr = connstr & server.mappath(strdbpath)
conn = server.createobject(adodb.connection) 설정
conn.open 연결
종료 기능
렘 ########################################### # ###############
rem ## 데이터베이스 연결을 닫습니다
렘 ########################################### # ###############
함수 f__closeconn()
isobject(conn)이면
연결 닫기
종료하면
conn = 아무것도 설정하지 않음
종료 기능
렘 ########################################### # ###############
rem은 실행 시간을 얻습니다.
렘 ########################################### # ###############
함수 gettimeover(iflag)
시간이 흐려
iflag = 1이면
ttimeover = formatnumber(timer() - intdatestart, 6, true)
gettimeover = 실행 시간: & ttimeover & 초
또 다른
ttimeover = formatnumber((timer() - intdatestart) * 1000, 3, true)
gettimeover = 실행 시간: & ttimeover & 밀리초
종료하면
종료 기능
렘 ########################################### # ###############
클래스 cls_pageview
비공개 sbooinitstate
비공개 sstr쿠키이름
개인 sstrpageurl
개인 sstrpagevar
개인 sstrtablename
비공개 sstrfieldslist
비공개 조건
비공개 시스템 목록
개인 sstrprimarykey
개인 신트레프레시
비공개 신기록 개수
비공개 신페이지 크기
비공개 신트페이지나우
비공개 신트페이지맥스
비공개 sobjconn
개인 sstrpageinfo
비공개 하위 클래스_초기화
Clearvars()를 호출하세요.
서브 끝
비공개 하위 클래스_종료()
sobjconn = 아무것도 설정하지 않음
서브 끝
공개 하위 Clearvars()
sbooinitstate = 거짓
sstr쿠키이름=
sstrpageurl=
sstrpagevar = 페이지
sstr테이블이름=
sstr필드리스트 =
조건 =
sstrorderlist =
sstr기본키=
신트리프레시=0
신트레코드카운트 = 0
신트페이지 크기=0
신트페이지나우=0
신트페이지맥스=0
서브 끝
rem ## 레코드 개수를 담는 쿠키 변수
공공 속성 let strcookiesname(value)
sstrcookiesname = 값
끝 속성
rem ## 리디렉션 주소
공개 속성 let strpageurl(value)
sstrpageurl = 값
끝 속성
rem ## 테이블 이름
공용 속성 let strtablename(value)
sstrtablename = 값
끝 속성
rem ## 필드 목록
공공 속성 let strfieldslist(value)
sstrfieldslist = 값
끝 속성
rem ## 쿼리 조건
공공 재산 let strcondiction(value)
값 <>이면
sstrcondiction = 위치 및 값
또 다른
조건 =
종료하면
끝 속성
rem ## 다음과 같은 필드 정렬: [id] asc, [createdatetime] desc
공공 재산 let strorderlist(value)
값 <>이면
sstrorderlist = 정렬 기준 및 값
또 다른
sstrorderlist =
종료하면
끝 속성
rem ## 레코드 수를 계산하는 데 사용되는 필드
공공 속성 let strprimarykey(value)
sstrprimarykey = 값
끝 속성
rem ## 각 페이지에 표시되는 레코드 수
공용 속성 let intpagesize(value)
sintpagesize = tonum(값, 20)
끝 속성
rem ## 데이터베이스 연결 개체
공공 재산 let objconn(value)
sobjconn = 값 설정
끝 속성
rem ## 현재 페이지
공공 속성 let intpagenow(value)
sintpagenow = tonum(값, 1)
끝 속성
rem ## 페이지 매개변수
공공 속성 let strpagevar(value)
sstrpagevar = 값
끝 속성
rem ## 새로 고침 여부 1은 새로 고침을 의미하고, 다른 값은 새로 고치지 않음을 의미합니다.
공공 재산 let intrefresh(value)
신트레프레시 = 토넘(값, 0)
끝 속성
rem ## 현재 페이지를 가져옵니다
공공 재산은 intpagenow()를 얻습니다
intpagenow = singpagenow
끝 속성
rem ## 페이지 매김 정보
공공 재산은 strpageinfo()를 얻습니다.
strpageinfo = sstrpageinfo
끝 속성
rem ## 레코드 세트, 2차원 배열 또는 문자열을 가져옵니다. 루프 출력을 수행할 때 판단하려면 isarray()를 사용해야 합니다.
공공 재산은 arrrecordinfo()를 얻습니다.
sbooinitstate가 아니라면
출구 속성
종료하면
디머, SQL
sql = 선택 & sstrfieldslist & _
& sstrtablename & _에서
조건&_
sstrorderlist
rs = server.createobject(adodb.recordset) 설정
rs.open SQL, sobjconn, 1, 1
그렇지 않은 경우(rs.eof 또는 rs.bof)
rs.pagesize = 신트페이지 크기
rs.absolutepage = 신트페이지나우
그렇지 않은 경우(rs.eof 또는 rs.bof)
arrrecordinfo = rs.getrows(sintpagesize)
또 다른
arrrecordinfo=
종료하면
또 다른
arrrecordinfo=
종료하면
RS.닫기
설정자=아무것도 없음
끝 속성
rem ## 레코드 개수 초기화
개인 하위 initrecordcount()
신트레코드카운트 = 0
그렇지 않은 경우(sbooinitstate) 하위를 종료합니다.
희미한 신트엠프
sinttmp = tonum(request.cookies(_xp_ & sstrcookiesname), -1)
if ((sinttmp < 0) 또는 (sintrefresh = 1))then
희미한 SQL, RS
sql = 개수 선택( & sstrprimarykey & ) & _
& sstrtablename & _에서
스트레스 조건
rs = sobjconn.execute(sql) 설정
rs.eof 또는 rs.bof인 경우
신트엠프 = 0
또 다른
신트엠프 = RS(0)
종료하면
신트레코드카운트 = sinttmp
response.cookies(_xp_ & sstrcookiesname) = sinttmp
또 다른
신트레코드카운트 = sinttmp
종료하면
서브 끝
rem ## 페이징 정보 초기화
비공개 하위 initpageinfo()
sstr페이지정보=
그렇지 않은 경우(sbooinitstate) 하위를 종료합니다.
희미한 술
surl = sstrpageurl
instr(1, surl, ?, 1) > 0이면
surl = surl & & & sstrpagevar & =
또 다른
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 & 페이지: <strong><font color=#990000> & sintpagenow & </font> / & sintpagemax & </strong>
sstrpageinfo = sstrpageinfo & total<strong> & sintrecordcount & </strong> 레코드<strong> & sintpagesize & </strong> 레코드/페이지
서브 끝
rem ## 긴 정수 변환
개인 함수 tonum(s, 기본값)
s = s &
s <>이고 숫자가 아닌 경우
토넘 = clng(들)
또 다른
토넘=기본값
종료하면
종료 기능
rem ## 클래스 초기화
공개 하위 초기화 클래스()
sbooinitstate = 사실
그렇지 않은 경우(isobject(sobjconn)) sbooinitstate = false
initrecordcount()를 호출하세요.
initpageinfo()를 호출하세요.
서브 끝
수업 종료
희미한 strlocalurl
strlocalurl = request.servervariables(script_name)
희미한 intpagenow
intpagenow = request.querystring(페이지)
희미한 intpagesize, strpageinfo
정수 페이지 크기=30
어두컴컴한 기록정보,나
희미한 콘
f__openconn
희미한 기록 정보
clsrecordinfo 설정 = 새 cls_pageview
clsrecordinfo.strtablename = [내 테이블]
clsrecordinfo.strpageurl = strlocalurl
clsrecordinfo.strfieldslist = [id], [제목], [마지막 시간]
clsrecordinfo.strcondiction = [id] < 10000
clsrecordinfo.strorderlist = [id] asc
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>
<!--
.페이지뷰 {
글꼴 크기: 12px;
}
.페이지뷰 td {
테두리 오른쪽 스타일: 단색;
테두리 하단 스타일: 단색;
테두리 오른쪽 색상: #e0e0e0;
테두리 하단 색상: #e0e0e0;
테두리 오른쪽 너비: 1px;
테두리 하단 너비: 1px;
}
.pageview 테이블 {
테두리 왼쪽 스타일: 단색;
테두리 상단 스타일: 단색;
테두리 왼쪽 색상: #e0e0e0;
테두리 상단 색상: #e0e0e0;
테두리 상단 너비: 1px;
테두리 왼쪽 너비: 1px;
}
tr.헤더 {
배경: #eff7ff;
글꼴 크기: 14px;
글꼴 두께: 굵게;
줄 높이: 120%;
텍스트 정렬: 중앙;
}
-->
</style>
<스타일 유형=텍스트/css>
<!--
몸 {
글꼴 크기: 12px;
}
a:링크 {
색상: #993300;
텍스트 장식: 없음;
}
a:방문했습니다 {
색상: #003366;
텍스트 장식: 없음;
}
a:호버 {
색상: #0066cc;
텍스트 장식: 밑줄;
}
a:활성 {
색상: #000000;
텍스트 장식: 없음;
}
테이블 {
글꼴 크기: 12px;
}
-->
</style>
</head>
<본문>
<테이블 너비=100% 테두리=0 셀 간격=0 셀 패딩=4>
<tr>
<td> <%= strpageinfo%></td>
</tr>
</table>
<div 클래스=페이지뷰>
<테이블 너비=100% 테두리=0 셀 간격=0 셀 패딩=4>
<tr 클래스=헤더>
<td>아이디</td>
<td>설명</td>
<td>날짜</td>
</tr>
<%
isarray(arrrecordinfo)이면
i = 0에서 ubound(arrrecordinfo, 2)로
%>
<tr>
<td> <%= arrrecordinfo(0, i)%></td>
<td> <%= arrrecordinfo(1, i)%></td>
<td> <%= arrrecordinfo(2, i)%></td>
</tr>
<%
다음
종료하면
%>
</table>
</div>
<테이블 너비=100% 테두리=0 셀 간격=0 셀 패딩=4>
<tr>
<td> <%= strpageinfo%></td>
</tr>
</table>
<테이블 너비=100% 테두리=0 셀 간격=0 셀 패딩=4>
<tr>
<td align=center> <%= gettimeover(1)%></td>
</tr>
</table>
</body>
</html>