الفكرة الرئيسية: استخدم عبارة واحدة لحساب (عد) عدد السجلات (بدلاً من الحصول على سمة RecordCount عند الاستعلام)، وتخزينها مؤقتًا في ملفات تعريف الارتباط، ولا تحتاج إلى العد مرة أخرى عند القفز للراحة، تم استدعاؤها وكتابتها كفصل دراسي، وتم شرح الأجزاء الرئيسية من التعليمات البرمجية
لبيئة الأجهزة: 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" CODEPAGE="936"%>
<%الخيار الصريح%>
<%
خافت intDateStart
intDateStart = الموقت ()
Rem ## فتح اتصال قاعدة البيانات
ريم ######################################################################################### ##############
الدالة f__OpenConn()
خافت strDbPath
خافت كونستر
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) ثم
conn. Close
نهاية إذا
تعيين كون = لا شيء
وظيفة النهاية
ريم ######################################################################################### ##############
ريم تحصل على وقت التنفيذ
ريم ######################################################################################### ##############
الدالة getTimeOver(iflag)
خافت tTimeOver
إذا iflag = 1 ثم
tTimeOver = FormatNumber(Timer() - intDateStart, 6, صحيح)
getTimeOver = "وقت التنفيذ: " & tTimeOver & " ثانية"
آخر
tTimeOver = FormatNumber((Timer() - intDateStart) * 1000، 3، صحيح)
getTimeOver = "وقت التنفيذ: " & tTimeOver & " مللي ثانية"
نهاية إذا
وظيفة النهاية
ريم ######################################################################################### ##############
فئة Cls_PageView
sbooInitState الخاص
اسم ملف تعريف الارتباط الخاص
sstrPageUrl الخاص
sstrPageVar الخاص
اسم sstrTableName الخاص
قائمة الحقول الخاصة
حالة خاصة
قائمة sstrOrderList الخاصة
مفتاح sstrPrimary خاص
تحديث Sint الخاص
SintRecordCount الخاص
حجم صفحة Sint الخاص
صفحة سينت خاصة الآن
سينتباجماكس الخاص
سوبجكون الخاص
معلومات sstrPageInfo الخاصة
فئة فرعية خاصة_تهيئة
استدعاء ClearVars ()
نهاية الفرعية
فئة فرعية خاصة_إنهاء ()
تعيين sobjConn = لا شيء
نهاية الفرعية
ClearVars الفرعي العام ()
sbooInitState = خطأ
sstrCookiesName = ""
sstrPageUrl = ""
sstrPageVar = "الصفحة"
sstrTableName = ""
سسترفيلدسليست = ""
سستركونديكشن = ""
سسترورديرليست = ""
سستربريماريكي = ""
تحديث سينت = 0
سينت ريكوردكونت = 0
حجم الصفحة = 0
سينتباجيناو = 0
سينتباج ماكس = 0
نهاية الفرعية
Rem ## متغير ملفات تعريف الارتباط الذي يحفظ عدد السجلات
السماح للملكية العامة strCookiesName(Value)
sstrCookiesName = القيمة
نهاية الملكية
Rem ## عنوان إعادة التوجيه
السماح للملكية العامة strPageUrl(Value)
sstrPageUrl=القيمة
نهاية الملكية
Rem ## اسم الجدول
السماح للملكية العامة strTableName(Value)
sstrTableName = القيمة
نهاية الملكية
Rem ## قائمة الحقول
السماح للملكية العامة strFieldsList(Value)
sstrFieldsList = Value
نهاية الملكية
Rem ## شروط الاستعلام
الملكية العامة اسمحوا strCondiction(القيمة)
إذا كانت القيمة <> "" ثم
sstrCondiction = "أين" والقيمة
آخر
سستركونديكشن = ""
نهاية إذا
نهاية الملكية
Rem ## حقول الفرز، مثل: [ID] ASC، [CreateDateTime] DESC
السماح للملكية العامة strOrderList(Value)
إذا كانت القيمة <> "" ثم
sstrOrderList = "الترتيب حسب" & القيمة
آخر
سسترورديرليست = ""
نهاية إذا
نهاية الملكية
Rem ## الحقل المستخدم لحساب عدد السجلات
دع الملكية العامة strPrimaryKey(Value)
sstrPrimaryKey = Value
نهاية الملكية
Rem ## عدد السجلات المعروضة في كل صفحة
السماح للملكية العامة intPageSize(Value)
sintPageSize = toNum(Value, 20)
نهاية الملكية
Rem ## كائن اتصال قاعدة البيانات
الملكية العامة دع objConn(القيمة)
قم بتعيين sobjConn = Value
نهاية الملكية
ريم ## الصفحة الحالية
السماح للملكية العامة intPageNow(Value)
sintPageNow = toNum(القيمة، 1)
نهاية الملكية
Rem ## معلمات الصفحة
السماح للملكية العامة strPageVar(Value)
sstrPageVar = القيمة
نهاية الملكية
Rem ## ما إذا كان سيتم التحديث 1 يعني التحديث، والقيم الأخرى لا يتم تحديثها.
الملكية العامة دع intRefresh(القيمة)
سينتريفريش = toNum(القيمة، 0)
نهاية الملكية
Rem ## احصل على الصفحة الحالية
الملكية العامة احصل على intPageNow()
intPageNow = SingPageNow
نهاية الملكية
Rem ## معلومات ترقيم الصفحات
الملكية العامة احصل على strPageInfo()
strPageInfo = sstrPageInfo
نهاية الملكية
Rem ## للحصول على مجموعة سجلات أو مصفوفة أو سلسلة ثنائية الأبعاد، يجب عليك استخدام IsArray() للحكم عند تنفيذ إخراج الحلقة.
الملكية العامة احصل على arrRecordInfo()
إذا لم يكن sbooInitState ثم
خاصية الخروج
نهاية إذا
خافت روبية، SQL
SQL = "SELECT" & 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)
آخر
آرريكوردينفو = ""
نهاية إذا
آخر
آرريكوردينفو = ""
نهاية إذا
rs. Close
اضبط rs = لا شيء
نهاية الملكية
Rem ## تهيئة عدد السجلات
InitRecordCount الفرعي الخاص ()
سينت ريكوردكونت = 0
إذا لم يكن (sbooInitState) ثم قم بالخروج من Sub
خافت سينتتمب
sintTmp = toNum(request.Cookies("_xp_" & sstrCookiesName), -1)
إذا ((sintTmp < 0) أو (sintRefresh = 1))ثم
خافت SQL، روبية
sql = "SELECT COUNT(" & sstrPrimaryKey & ")" & _
" من " & sstrTableName & _
sstrCondiction
تعيين rs = sobjConn.execute (sql)
إذا rs.eof أو rs.bof ثم
سينتمب = 0
آخر
سينتمب = روبية (0)
نهاية إذا
sintRecordCount = sintTmp
Response.Cookies("_xp_" & sstrCookiesName) = sintTmp
آخر
sintRecordCount = sintTmp
نهاية إذا
نهاية الفرعية
Rem ## تهيئة معلومات الترحيل
InitPageInfo الفرعي الخاص ()
سسترPageInfo = ""
إذا لم يكن (sbooInitState) ثم قم بالخروج من Sub
خافت
surl = sstrPageUrl
إذا كان Instr(1, surl, "؟", 1) > 0 إذن
surl = surl & "&" & sstrPageVar & "="
آخر
surl = surl & "؟" & sstrPageVar & "=
نهاية إذا
إذا كان sintPageNow <= 0، فإن sintPageNow = 1
إذا كان تعديل sintRecordCount 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 ## تحويل عدد صحيح طويل
وظيفة خاصة لعدد (أرقام، افتراضي)
ق = ق & ""
إذا كان s <> "" و IsNumeric(s) إذن
toNum = CLng(s)
آخر
toNum = الافتراضي
نهاية إذا
وظيفة النهاية
Rem ## تهيئة الفصل
InitClass الفرعي العام ()
sbooInitState = صحيح
إذا لم يكن (IsObject(sobjConn)) ثم sbooInitState = False
CallInitRecordCount()
كولينيتباجينفو ()
نهاية الفرعية
نهاية الفصل
خافت strLocalUrl
strLocalUrl = request.ServerVariables("SCRIPT_NAME")
خافت intPageNow
intPageNow = request.QueryString("page")
خافت intPageSize، strPageInfo
حجم الصفحة = 30
خافت arrRecordInfo، أنا
ديم كون
f__OpenConn
خافت clsRecordInfo
تعيين clsRecordInfo = New Cls_PageView
clsRecordInfo.strTableName = "[myTable]"
clsRecordInfo.strPageUrl = strLocalUrl
clsRecordInfo.strFieldsList = "[المعرف]، [العنوان]، [آخر مرة]"
clsRecordInfo.strCondiction = "[المعرف] < 10000"
clsRecordInfo.strOrderList = "[المعرف] ASC"
clsRecordInfo.strPrimaryKey = "[المعرف]"
clsRecordInfo.intPageSize = 20
clsRecordInfo.intPageNow = intPageNow
clsRecordInfo.strCookiesName = "RecordCount"
clsRecordInfo.strPageVar = "الصفحة"
clsRecordInfo.intRefresh = 0
clsRecordInfo.objConn = Conn
clsRecordInfo.InitClass
arrRecordInfo = clsRecordInfo.arrRecordInfo
strPageInfo = clsRecordInfo.strPageInfo
تعيين clsRecordInfo = لا شيء
f__CloseConn
%>
<أتش تي أم أل>
<الرأس>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>اختبار الترحيل</title>
<نمط النوع = "نص/CSS">
<!--
عرض الصفحة {
حجم الخط: 12 بكسل؛
}
عرض الصفحة تد {
نمط الحدود اليمنى: صلب؛
نمط الحدود السفلية: صلب؛
لون الحدود الأيمن: #E0E0E0؛
لون الحد السفلي: #E0E0E0؛
عرض الحدود اليمنى: 1 بكسل؛
عرض الحد السفلي: 1 بكسل؛
}
جدول عرض الصفحة {
نمط الحدود اليسرى: صلب؛
نمط الحدود الأعلى: صلب؛
لون الحدود اليسرى: #E0E0E0؛
لون الحدود العلوي: #E0E0E0؛
عرض الحد العلوي: 1 بكسل؛
عرض الحدود اليسرى: 1 بكسل؛
}
رأس الصفحة {
الخلفية: #EFF7FF؛
حجم الخط: 14 بكسل؛
وزن الخط: غامق؛
ارتفاع الخط: 120%؛
محاذاة النص: مركز؛
}
-->
</نمط>
<نمط النوع = "نص/CSS">
<!--
جسم {
حجم الخط: 12 بكسل؛
}
أ: الرابط {
اللون: #993300؛
زخرفة النص: لا شيء؛
}
أ: زار {
اللون: #003366؛
زخرفة النص: لا شيء؛
}
أ:تحوم {
اللون: #0066CC؛
زخرفة النص: تسطير؛
}
أ:نشط {
اللون: #000000؛
زخرفة النص: لا شيء؛
}
طاولة {
حجم الخط: 12 بكسل؛
}
-->
</نمط>
</الرأس>
<الجسم>
<عرض الجدول = "100%" الحدود = "0" تباعد الخلايا = "0" خلية الحشو = "4">
<تر>
<td> <%= strPageInfo%></td>
</tr>
</الجدول>
<div class="PageView">
<عرض الجدول = "100%" الحدود = "0" تباعد الخلايا = "0" خلية الحشو = "4">
<tr class="الرأس">
<td>المعرف</td>
<td>الوصف</td>
<td>التاريخ</td>
</tr>
<%
إذا كان IsArray(arrRecordInfo) إذن
لأني = 0 إلى UBound(arrRecordInfo, 2)
%>
<تر>
<td> <%= arrRecordInfo(0, i)%></td>
<td> <%= arrRecordInfo(1, i)%></td>
<td> <%= arrRecordInfo(2, i)%></td>
</tr>
<%
التالي
نهاية إذا
%>
</الجدول>
</div>
<عرض الجدول = "100%" الحدود = "0" تباعد الخلايا = "0" خلية الحشو = "4">
<تر>
<td> <%= strPageInfo%></td>
</tr>
</الجدول>
<عرض الجدول = "100%" الحدود = "0" تباعد الخلايا = "0" خلية الحشو = "4">
<تر>
<td align="center"> <%= getTimeOver(1)%></td>
</tr>
</الجدول>
</الجسم>
</html>