주요 아이디어: 쿼리할 때 RecordCount 속성을 얻는 대신 하나의 문을 사용하여 레코드 수를 계산하고(쿼리할 때 RecordCount 속성을 가져오는 대신) 이를 쿠키에 캐시하며, 점프할 때 ADO의 AbsolutePage 속성을 사용하여 다음으로 이동할 필요가 없습니다. 페이지 편의상 클래스라고 부르며, 코드의 주요 부분을 설명했습니다.
하드웨어 환경: AMD Athlon XP 2600+, 256 DDR
소프트웨어 환경: MS Windows 2000 Advanced Server + IIS 5.0 + Access 2000 + IE 6.0
테스트 결과: 초기 실행 시간은 250(홈 페이지) - 400(마지막 페이지) 밀리초이며, (레코드 번호가 캐시된 후) 페이지 간 점프는 47밀리초 미만으로 안정적입니다. 페이지 소요 시간은 350ms를 넘지 않습니다.
적용 범위 : 일반적인 페이징에 사용됩니다. 더 복잡한 쿼리에는 적합하지 않습니다. 조건이 "[제목] '%favorite%'와 같습니다"인 경우에는 쿼리 시간이 크게 늘어납니다. 제목 필드는 색인화되어 있으므로 쓸모가 없습니다.
< %@LANGUAGE = "VBScript" CODEPAGE="936"%>
<%옵션 명시적%>
<%
Dim intDateStart
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
비공개 sstrCookiesName
비공개 sstrPageUrl
비공개 sstrPageVar
비공개 sstrTableName
비공개 sstrFieldsList
비공개 sstr조건
비공개 sstrOrderList
비공개 sstrPrimaryKey
비공개 신트새로고침
비공개 sintRecordCount
비공개 신트페이지 크기
비공개 신트페이지나우(sintPageNow)
비공개 신트페이지맥스
비공개 sobjConn
비공개 sstrPageInfo
비공개 하위 클래스_초기화
ClearVars() 호출
서브 끝
비공개 하위 class_terminate()
sobjConn = 아무것도 설정하지 않음
서브 끝
공개 하위 ClearVars()
sbooInitState = 거짓
sstrCookiesName = ""
sstrPageUrl = ""
sstrPageVar = "페이지"
sstr테이블이름 = ""
sstrFieldsList = ""
sstr조건 = ""
sstrOrderList = ""
sstrPrimaryKey = ""
신트새로고침 = 0
신트레코드카운트 = 0
신트페이지 크기 = 0
신트페이지지금 = 0
신트페이지최대 = 0
서브 끝
Rem ## 레코드 개수를 저장하는 쿠키 변수
공용 속성 Let strCookiesName(Value)
sstrCookiesName = 값
끝 속성
Rem ## 리디렉션 주소
공용 속성 Let strPageUrl(Value)
sstrPageUrl=값
끝 속성
Rem ## 테이블 이름
공용 속성 Let strTableName(값)
sstrTableName = 값
끝 속성
Rem ## 필드 목록
공용 속성 Let strFieldsList(Value)
sstrFieldsList = 값
끝 속성
Rem ## 쿼리 조건
공용 속성 Let strCondiction(Value)
값 <> ""이면
sstrCondiction = " WHERE " & 값
또 다른
sstr조건 = ""
종료 조건
끝 속성
Rem ## 다음과 같은 필드 정렬: [ID] ASC, [CreateDateTime] DESC
공용 속성 Let strOrderList(Value)
값 <> ""이면
sstrOrderList = " ORDER BY " 및 값
또 다른
sstrOrderList = ""
종료 조건
끝 속성
Rem ## 레코드 수를 계산하는 데 사용되는 필드
공용 속성 Let strPrimaryKey(Value)
sstrPrimaryKey = 값
끝 속성
Rem ## 각 페이지에 표시되는 레코드 수
공용 속성 Let intPageSize(값)
sintPageSize = toNum(값, 20)
끝 속성
Rem ## 데이터베이스 연결 개체
공용 속성 Let objConn(Value)
sobjConn = 값 설정
끝 속성
Rem ## 현재 페이지
공용 속성 Let intPageNow(값)
sintPageNow = toNum(값, 1)
끝 속성
Rem ## 페이지 매개변수
공용 속성 Let strPageVar(Value)
sstrPageVar = 값
끝 속성
Rem ## 새로 고침 여부. 1은 새로 고침을 의미하며 다른 값은 새로 고침되지 않습니다.
공용 속성 Let intRefresh(Value)
sintRefresh = toNum(값, 0)
끝 속성
Rem ## 현재 페이지 가져오기
공용 속성 Get intPageNow()
intPageNow = 노래페이지지금
끝 속성
Rem ## 페이지 매김 정보
공용 속성 strPageInfo() 가져오기
strPageInfo = sstrPageInfo
끝 속성
Rem ## 레코드 세트, 2차원 배열 또는 문자열을 얻으려면 루프 출력을 수행할 때 IsArray()를 사용하여 판단해야 합니다.
공용 속성 arrRecordInfo() 가져오기
sbooInitState가 아니면
출구 속성
종료 조건
희미한 RS, SQL
sql = "SELECT " & sstrFieldsList & _
" FROM " & sstr테이블 이름 & _
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.닫기
rs = 없음으로 설정
끝 속성
Rem ## 레코드 개수 초기화
비공개 하위 InitRecordCount()
신트레코드카운트 = 0
Not(sbooInitState)인 경우 Sub를 종료합니다.
희미한 sintTmp
sintTmp = toNum(request.Cookies("_xp_" & sstrCookiesName), -1)
If ((sintTmp < 0) 또는 (sintRefresh = 1)) 그러면
희미한 SQL, RS
sql = "SELECT COUNT(" & sstrPrimaryKey & ")" & _
" FROM " & sstr테이블 이름 & _
sstr조건
rs = sobjConn.execute(sql) 설정
rs.eof 또는 rs.bof인 경우
신트Tmp = 0
또 다른
sintTmp = rs(0)
종료 조건
sintRecordCount = sintTmp
response.Cookies("_xp_" & sstrCookiesName) = sintTmp
또 다른
sintRecordCount = sintTmp
종료 조건
서브 끝
Rem ## 페이징 정보 초기화
비공개 하위 InitPageInfo()
sstrPageInfo = ""
Not(sbooInitState)인 경우 Sub를 종료합니다.
희미한 술
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 & "전체<strong>" & sintRecordCount & "</strong>기록<strong>" & sintPageSize & "</strong>기록/페이지"
서브 끝
Rem ## 긴 정수 변환
개인 함수 toNum(s, Default)
s = s & ""
s <> "" 그리고 IsNumeric(s)이면
toNum = CLng(들)
또 다른
toNum = 기본값
종료 조건
기능 종료
Rem ## 클래스 초기화
공개 하위 InitClass()
sbooInitState = 참
If Not(IsObject(sobjConn)) 그러면 sbooInitState = False
CallInitRecordCount()
CallInitPageInfo()
서브 끝
수업 종료
희미한 strLocalUrl
strLocalUrl = request.ServerVariables("SCRIPT_NAME")
Dim intPageNow
intPageNow = request.QueryString("페이지")
희미한 intPageSize, strPageInfo
intPageSize = 30
희미한 arrRecordInfo, i
딤 콘
f__오픈콘
희미한 clsRecordInfo
clsRecordInfo = New Cls_PageView 설정
clsRecordInfo.strTableName = "[myTable]"
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 = "RecordCount"
clsRecordInfo.strPageVar = "페이지"
clsRecordInfo.intRefresh = 0
clsRecordInfo.objConn=콘
clsRecordInfo.InitClass
arrRecordInfo = clsRecordInfo.arrRecordInfo
strPageInfo = clsRecordInfo.strPageInfo
clsRecordInfo = 아무것도 설정하지 않음
f__CloseConn
%>
<html>
<머리>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>페이징 테스트</title>
<스타일 유형="텍스트/css">
<!--
.페이지뷰 {
글꼴 크기: 12px;
}
.페이지뷰 td {
테두리 오른쪽 스타일: 단색;
테두리 하단 스타일: 단색;
테두리 오른쪽 색상: #E0E0E0;
테두리 하단 색상: #E0E0E0;
테두리 오른쪽 너비: 1px;
테두리 하단 너비: 1px;
}
.페이지뷰 테이블 {
테두리 왼쪽 스타일: 단색;
테두리 상단 스타일: 단색;
테두리 왼쪽 색상: #E0E0E0;
테두리 상단 색상: #E0E0E0;
테두리 상단 너비: 1px;
테두리 왼쪽 너비: 1px;
}
tr.헤더 {
배경: #EFF7FF;
글꼴 크기: 14px;
글꼴 두께: 굵게;
줄 높이: 120%;
텍스트 정렬: 중앙;
}
-->
</style>
<스타일 유형="텍스트/css">
<!--
몸 {
글꼴 크기: 12px;
}
a:링크 {
색상: #993300;
텍스트 장식: 없음;
}
a:방문했습니다 {
색상: #003366;
텍스트 장식: 없음;
}
a:호버 {
색상: #0066CC;
텍스트 장식: 밑줄;
}
a:활성 {
색상: #000000;
텍스트 장식: 없음;
}
테이블 {
글꼴 크기: 12px;
}
-->
</style>
</head>
<본문>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr>
<td> <%= strPageInfo%></td>
</tr>
</table>
<div 클래스="페이지뷰">
<table width="100%" border="0" cellpacing="0" cellpadding="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>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr>
<td> <%= strPageInfo%></td>
</tr>
</table>
<table width="100%" border="0" cellpacing="0" cellpadding="4">
<tr>
<td align="center"> <%= getTimeOver(1)%></td>
</tr>
</table>
</body>
</html>