แนวคิดหลัก: ใช้คำสั่งเดียวเพื่อนับ (นับ) จำนวนระเบียน (แทนที่จะรับแอตทริบิวต์ RecordCount เมื่อทำการสอบถาม) แคชไว้ในคุกกี้ และไม่จำเป็นต้องนับอีกครั้งเมื่อข้ามไปที่แอตทริบิวต์ 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 ได้รับการจัดทำดัชนีแล้ว มันจะไร้ประโยชน์ :(
< %@LANGUAGE = "VBScript" CODEPAGE="936"%>
<%ตัวเลือกที่ชัดเจน%>
-
Dim intDateStart
intDateStart = ตัวจับเวลา ()
Rem ## เปิดการเชื่อมต่อฐานข้อมูล
######################################################################## ## ##############
ฟังก์ชั่น f__OpenConn()
Dim strDbPath
คอนทราสต์สลัว
strDbPath = "../db/test.mdb"
connstr = "ผู้ให้บริการ=Microsoft.Jet.OLEDB.4.0;แหล่งข้อมูล="
connstr = connstr & Server.MapPath (strDbPath)
ตั้งค่า conn = Server.CreateObject("Adodb.Connection")
conn.open constr
สิ้นสุดฟังก์ชัน
######################################################################## ## ##############
Rem ## ปิดการเชื่อมต่อฐานข้อมูล
######################################################################## ## ##############
ฟังก์ชั่น f__CloseConn()
ถ้า IsObject(conn) แล้ว
เชื่อมต่อปิด
สิ้นสุดถ้า
ตั้งค่าคอน = ไม่มีอะไร
สิ้นสุดฟังก์ชัน
######################################################################## ## ##############
Rem ได้รับเวลาประหารชีวิต
######################################################################## ## ##############
ฟังก์ชั่น getTimeOver (iflag)
Dim tTimeOver
ถ้า iflag = 1 แล้ว
tTimeOver = FormatNumber(Timer() - intDateStart, 6, จริง)
getTimeOver = "เวลาดำเนินการ: " & tTimeOver & " วินาที"
อื่น
tTimeOver = FormatNumber((ตัวจับเวลา() - intDateStart) * 1,000, 3, จริง)
getTimeOver = "เวลาดำเนินการ: " & tTimeOver & " มิลลิวินาที"
สิ้นสุดถ้า
สิ้นสุดฟังก์ชัน
######################################################################## ## ##############
คลาส Cls_PageView
sbooInitState ส่วนตัว
sstrCookiesName ส่วนตัว
sstrPageUrl ส่วนตัว
sstrPageVar. ส่วนตัว
sstrTableName ส่วนตัว
sstrFieldsList ส่วนตัว
sstrCondiction ส่วนตัว
sstrOrderList ส่วนตัว
sstrPrimaryKey ส่วนตัว
sinRefresh ส่วนตัว
sintRecordCount ส่วนตัว
sinPageSize ส่วนตัว
sinPageNow ส่วนตัว
sinPageMax ส่วนตัว
ส่วนตัวสะอื้น
sstrPageInfo ส่วนตัว
คลาสย่อยส่วนตัว_เริ่มต้น
โทร ClearVars()
จบหมวดย่อย
class_terminate ส่วนตัวย่อย ()
ตั้งค่า sobjConn = ไม่มีอะไร
จบหมวดย่อย
สาธารณะย่อย ClearVars()
sbooInitState = เท็จ
sstrCookiesName = ""
sstrPageUrl = ""
sstrPageVar = "หน้า"
sstrTableName = ""
sstrFieldsList = ""
sstrCondiction = ""
sstrOrderList = ""
sstrPrimaryKey = ""
ซินต์รีเฟรช = 0
sintRecordCount = 0
ขนาดหน้าเพจ = 0
sintPageNow = 0
sintPageMax = 0
จบหมวดย่อย
Rem ## ตัวแปร Cookies ที่บันทึกจำนวนระเบียน
ทรัพย์สินสาธารณะให้ strCookiesName (มูลค่า)
sstrCookiesName = ค่า
สิ้นสุดคุณสมบัติ
Rem ## ที่อยู่การเปลี่ยนเส้นทาง
ทรัพย์สินสาธารณะให้ strPageUrl(มูลค่า)
sstrPageUrl=ค่า
สิ้นสุดคุณสมบัติ
Rem ## ชื่อโต๊ะ
ทรัพย์สินสาธารณะให้ strTableName(มูลค่า)
sstrTableName = ค่า
สิ้นสุดคุณสมบัติ
รายการเขต Rem ##
ทรัพย์สินสาธารณะให้ strFieldsList (มูลค่า)
sstrFieldsList = ค่า
สิ้นสุดคุณสมบัติ
Rem ## เงื่อนไขการสืบค้น
ทรัพย์สินสาธารณะ Let strCondiction(มูลค่า)
ถ้าค่า <> "" แล้ว
sstrCondiction = " WHERE " & ค่า
อื่น
sstrCondiction = ""
สิ้นสุดถ้า
สิ้นสุดคุณสมบัติ
Rem ## ฟิลด์การเรียงลำดับ เช่น: [ID] ASC, [CreateDateTime] DESC
ทรัพย์สินสาธารณะให้ strOrderList (มูลค่า)
ถ้าค่า <> "" แล้ว
sstrOrderList = " เรียงตาม " & ค่า
อื่น
sstrOrderList = ""
สิ้นสุดถ้า
สิ้นสุดคุณสมบัติ
Rem ## ฟิลด์ที่ใช้นับจำนวนเรคคอร์ด
ทรัพย์สินสาธารณะให้ strPrimaryKey (มูลค่า)
sstrPrimaryKey = ค่า
สิ้นสุดคุณสมบัติ
Rem ## จำนวนบันทึกที่แสดงในแต่ละหน้า
ทรัพย์สินสาธารณะให้ intPageSize (มูลค่า)
sintPageSize = toNum(ค่า, 20)
สิ้นสุดคุณสมบัติ
Rem ## วัตถุการเชื่อมต่อฐานข้อมูล
ทรัพย์สินสาธารณะให้ objConn (มูลค่า)
ตั้งค่า sobjConn = ค่า
สิ้นสุดคุณสมบัติ
เรม ## หน้าปัจจุบัน
ทรัพย์สินสาธารณะ Let intPageNow(มูลค่า)
sintPageNow = toNum(ค่า, 1)
สิ้นสุดคุณสมบัติ
Rem ## พารามิเตอร์เพจ
ทรัพย์สินสาธารณะให้ strPageVar (มูลค่า)
sstrPageVar = ค่า
สิ้นสุดคุณสมบัติ
Rem ## ไม่ว่าจะรีเฟรช 1 หมายถึงรีเฟรช ส่วนค่าอื่นๆ ไม่รีเฟรช
ทรัพย์สินสาธารณะ Let intRefresh(มูลค่า)
sintRefresh = toNum (ค่า, 0)
สิ้นสุดคุณสมบัติ
Rem ## รับหน้าปัจจุบัน
ทรัพย์สินสาธารณะรับ intPageNow()
intPageNow = ร้องเพลงPageNow
สิ้นสุดคุณสมบัติ
Rem ## ข้อมูลการแบ่งหน้า
ทรัพย์สินสาธารณะรับ strPageInfo()
strPageInfo = sstrPageInfo
สิ้นสุดคุณสมบัติ
Rem ## หากต้องการรับชุดบันทึก อาร์เรย์สองมิติหรือสตริง คุณต้องใช้ IsArray() เพื่อตัดสินเมื่อดำเนินการเอาท์พุตแบบวนซ้ำ
ทรัพย์สินสาธารณะรับ arrRecordInfo ()
ถ้าไม่ใช่ sbooInitState แล้ว
ออกจากคุณสมบัติ
สิ้นสุดถ้า
ติ่มซำ rs, sql
sql = "เลือก" & sstrFieldsList & _
" จาก " & sstrTableName & _
sstrCondiction&_
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 = ไม่มีเลย
สิ้นสุดคุณสมบัติ
Rem ## เริ่มต้นจำนวนบันทึก
InitRecordCount ย่อยส่วนตัว ()
sintRecordCount = 0
ถ้าไม่ (sbooInitState) ให้ออกจาก Sub
Dim SintTmp
sintTmp = toNum(คำขอ.คุกกี้("_xp_" & sstrCookiesName), -1)
ถ้า ((sintTmp < 0) หรือ (sintRefresh = 1))แล้ว
ติ่ม sql, อาร์เอส
sql = "เลือกนับ (" & sstrPrimaryKey & ")" & _
" จาก " & sstrTableName & _
sstrCondiction
ตั้งค่า rs = sobjConn.execute (sql)
ถ้า rs.eof หรือ rs.bof แล้ว
ซินTmp = 0
อื่น
sintTmp = อาร์เอส(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 & "="
อื่น
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 <> "" และ IsNumeric(s) แล้ว
toNum = CLng
อื่น
toNum = ค่าเริ่มต้น
สิ้นสุดถ้า
สิ้นสุดฟังก์ชัน
Rem ## การเริ่มต้นคลาส
InitClass ย่อยสาธารณะ ()
sbooInitState = จริง
ถ้าไม่ใช่(IsObject(sobjConn)) ดังนั้น sbooInitState = False
CallInitRecordCount ()
CallInitPageInfo()
จบหมวดย่อย
จบคลาส
หรี่ strLocalUrl
strLocalUrl = request.ServerVariables("SCRIPT_NAME")
Dim intPageNow
intPageNow = request.QueryString("หน้า")
หรี่ intPageSize, strPageInfo
intPageSize = 30
Dim arrRecordInfo, i
ดิม คอนน์
f__OpenConn
ติ่ม clsRecordInfo
ตั้งค่า clsRecordInfo = Cls_PageView ใหม่
clsRecordInfo.strTableName = "[ตารางของฉัน]"
clsRecordInfo.strPageUrl = strLocalUrl
clsRecordInfo.strFieldsList = "[รหัส], [ชื่อเรื่อง], [ครั้งล่าสุด]"
clsRecordInfo.strCondiction = "[รหัส] < 10,000"
clsRecordInfo.strOrderList = "[รหัส] ASC"
clsRecordInfo.strPrimaryKey = "[รหัส]"
clsRecordInfo.intPageSize = 20
clsRecordInfo.intPageNow = intPageNow
clsRecordInfo.strCookiesName = "จำนวนบันทึก"
clsRecordInfo.strPageVar = "หน้า"
clsRecordInfo.intRefresh = 0
clsRecordInfo.objConn = การเชื่อมต่อ
clsRecordInfo.InitClass
arrRecordInfo = clsRecordInfo.arrRecordInfo
strPageInfo = clsRecordInfo.strPageInfo
ตั้งค่า clsRecordInfo = ไม่มีเลย
f__ปิดคอน
-
<html>
<หัว>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>การทดสอบการแบ่งหน้า</title>
<style type="text/css">
-
.เพจวิว {
ขนาดตัวอักษร: 12px;
-
.PageView td {
เส้นขอบขวาสไตล์: ทึบ;
สไตล์ขอบด้านล่าง: ทึบ;
ขอบขวาสี: #E0E0E0;
ขอบล่างสี: #E0E0E0;
เส้นขอบขวากว้าง: 1px;
เส้นขอบด้านล่างกว้าง: 1px;
-
.ตาราง PageView {
สไตล์เส้นขอบซ้าย: ทึบ;
สไตล์ขอบด้านบน: ทึบ;
ขอบซ้ายสี: #E0E0E0;
ขอบสีด้านบน: #E0E0E0;
เส้นขอบด้านบนกว้าง: 1px;
เส้นขอบซ้ายกว้าง: 1px;
-
tr.ส่วนหัว {
พื้นหลัง: #EFF7FF;
ขนาดตัวอักษร: 14px;
น้ำหนักตัวอักษร: ตัวหนา;
ความสูงของเส้น: 120%;
การจัดแนวข้อความ: กึ่งกลาง;
-
-
</สไตล์>
<style type="text/css">
-
ร่างกาย {
ขนาดตัวอักษร: 12px;
-
เป็น: ลิงค์ {
สี: #993300;
การตกแต่งข้อความ: ไม่มี;
-
เป็น: เยี่ยมชม {
สี: #003366;
การตกแต่งข้อความ: ไม่มี;
-
เป็น:โฮเวอร์ {
สี: #0066CC;
การตกแต่งข้อความ: ขีดเส้นใต้;
-
เป็น:ใช้งานอยู่ {
สี: #000000;
การตกแต่งข้อความ: ไม่มี;
-
โต๊ะ {
ขนาดตัวอักษร: 12px;
-
-
</สไตล์>
</หัว>
<ร่างกาย>
<table width="100%" border="0" cellspacing="0" cellpadding="4">
<tr>
<td> <%= strPageInfo%></td>
</tr>
</ตาราง>
<div class="เพจวิว">
<table width="100%" border="0" cellspacing="0" cellpadding="4">
<tr class="ส่วนหัว">
<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>
-
ต่อไป
สิ้นสุดถ้า
-
</ตาราง>
</div>
<table width="100%" border="0" cellspacing="0" cellpadding="4">
<tr>
<td> <%= strPageInfo%></td>
</tr>
</ตาราง>
<table width="100%" border="0" cellspacing="0" cellpadding="4">
<tr>
<td align="center"> <%= getTimeOver(1)%></td>
</tr>
</ตาราง>
</ร่างกาย>
</html>