บทความนี้ส่วนใหญ่แนะนำวิธีการแสดงการเพจฐานข้อมูล ADO
เราจะแยกแยะผลลัพธ์การสืบค้นของฐานข้อมูลได้อย่างไร มีหลายวิธี แต่มี สอง วิธีหลัก:
1. อ่านระเบียนทั้งหมดในฐานข้อมูลที่ตรงกับเงื่อนไขการสืบค้นลงในบันทึกในครั้งเดียวและเก็บไว้ในหน่วยความจำ (หมายเลขหน้า) และ AbsolutePage (Absolute Page) เพื่อจัดการการประมวลผลเพจ
2. ตามคำแนะนำของลูกค้าจำนวนระเบียนที่ระบุจะต้องอ่านและแสดงจากบันทึกที่ตรงตามเงื่อนไขการสืบค้นในแต่ละครั้ง
ความแตกต่างที่สำคัญระหว่างทั้งสองคืออดีตอ่านบันทึกทั้งหมดเป็นหน่วยความจำในครั้งเดียวจากนั้นทำการตัดสินและการวิเคราะห์ตามลำดับตามคำแนะนำเพื่อให้ได้ผลของการแสดงการปนเปื้อนในขณะที่หลังทำให้การตัดสินตามคำแนะนำและตั้งค่า จำนวนที่ระบุเพื่อให้ตรงกับเงื่อนไขการสืบค้น
เราสามารถรู้สึกได้อย่างชัดเจนว่าเมื่อจำนวนระเบียนในฐานข้อมูลถึงหลายหมื่นหรือมากกว่านั้นประสิทธิภาพการดำเนินการของวิธีแรกจะต่ำกว่าวิธีที่สองอย่างมีนัยสำคัญเพราะเมื่อลูกค้าทุกคนสอบถามหน้าผลลัพธ์ทั้งหมด ถูกถ่ายโอน อย่างไรก็ตามเมื่อจำนวนเร็กคอร์ดในฐานข้อมูลบนเซิร์ฟเวอร์และจำนวนคนออนไลน์ในเวลาเดียวกันนั้นไม่ใหญ่ประสิทธิภาพการดำเนินการของทั้งสองเกือบจะเหมือนกัน โปรแกรม ASP ของวิธีแรกนั้นค่อนข้างเขียนวิธีที่สองนั้นง่ายกว่าและชัดเจนมาก
ที่นี่ผู้เขียนจะใช้โปรแกรม ASP BBS ทั่วไปของเราเป็นตัวอย่างในการวิเคราะห์วิธีการใช้ฟังก์ชั่นการแสดงการปนเปื้อนในโปรแกรม BBS มากเกินไป
การแสดงบรรยากาศเมื่อ ADO เข้าถึงฐานข้อมูลจริง ๆ แล้วเพื่อใช้งานระเบียนของชุดเร็กคอร์ด ดังนั้นเราต้องเข้าใจคุณสมบัติและวิธีการของวัตถุ reordset ก่อน:
แอตทริบิวต์ BOF: ตัวบ่งชี้ปัจจุบันหมายถึงธุรกรรมแรกไปยังชุดบันทึก
แอตทริบิวต์ EOF: ตัวบ่งชี้ปัจจุบันหมายถึงธุรกรรมล่าสุดไปยังชุดบันทึก
วิธีการย้าย: ย้ายตัวชี้วัดไปยังบันทึกในชุดบันทึก
คุณสมบัติ AbsolutePage: ตั้งค่าตำแหน่งปัจจุบันของบันทึกที่อยู่ในหน้าใด
คุณสมบัติ Pagecount: แสดงจำนวนหน้าของข้อมูลที่มีวัตถุบันทึกชุด
คุณสมบัติ PAGESIZE: แสดงจำนวนระเบียนที่แสดงในแต่ละหน้าของวัตถุ RecordSet
คุณสมบัติ RecordCount: แสดงจำนวนระเบียนทั้งหมดของวัตถุ RecordSet
ลองมาดูคุณลักษณะและวิธีการที่สำคัญเหล่านี้ให้ละเอียดกว่านี้
1. แอตทริบิวต์ BOF และ EOF
โดยปกติแล้วเราจะเขียนโค้ดในโปรแกรม ASP เพื่อตรวจสอบแอตทริบิวต์ BOF และ EOF เพื่อทราบตำแหน่งของชุดบันทึกที่ชี้ไปที่ตัวบ่งชี้ปัจจุบัน บรรทัดคือขอบเขตของวัตถุระเบียนที่เกิน
ตัวอย่างเช่น: < %ถ้าไม่ใช่ rs.eof แล้ว ... %>
< % ถ้าไม่ (Rs.Bof และ Rs.eof) %>
หากตำแหน่งระเบียนปัจจุบันอยู่ก่อนแถวแรกของวัตถุ RecordSet คุณสมบัติ BOF จะส่งคืนจริงมิฉะนั้นจะส่งคืนเท็จ
หากตำแหน่งระเบียนปัจจุบันอยู่หลังจากแถวสุดท้ายของวัตถุ RecordSet คุณสมบัติ EOF จะส่งคืนจริงมิฉะนั้นจะส่งคืนเท็จ
ทั้ง BOF และ EOF เป็นเท็จ: หมายความว่าตัวบ่งชี้อยู่ในชุดระเบียน
BOF เป็นจริง: ตัวบ่งชี้ปัจจุบันหมายถึงระเบียนแรกไปยังชุดบันทึก EOF เป็นจริง: ตัวบ่งชี้ปัจจุบันหมายถึงระเบียนสุดท้ายไปยังชุดบันทึก
ทั้ง BOF และ EOF เป็นจริง: ไม่มีบันทึกในชุดบันทึก
2. วิธีการย้าย
คุณสามารถใช้วิธีการย้ายเพื่อย้ายตัวชี้วัดไปยังบันทึกในชุดบันทึกด้วยไวยากรณ์ดังนี้:
Rs.move numrecords เริ่มต้น
ที่นี่ RS เป็นตัวแปรวัตถุโดยระบุวัตถุ recordset ที่ต้องการย้ายเมื่อตำแหน่งบันทึกปัจจุบัน; แท็กเริ่มต้น
วัตถุบันทึกทั้งหมดรองรับวิธีการย้าย วิธีการข้อผิดพลาดจะถูกสร้างขึ้น
MoveFirst Method: เลื่อนตำแหน่งระเบียนปัจจุบันไปยังระเบียนแรก
Movelast Method: เลื่อนตำแหน่งระเบียนปัจจุบันไปยังระเบียนสุดท้าย
Movenext Method: เลื่อนตำแหน่งระเบียนปัจจุบันไปยังระเบียนถัดไป MovePrevious Method: ย้ายตำแหน่งบันทึกปัจจุบันไปยังระเบียนก่อนหน้า
ย้าย [n] วิธี: ย้ายดัชนีไปยังระเบียนปากกา n, n เริ่มต้นจาก 0
3. คุณลักษณะ AbsolutePage
คุณสมบัติ AbsolutePage ตั้งค่าหน้าหน้าของหน้าเว็บที่ตั้งอยู่; บันทึกหน้า) จะต้องมีการบันทึกไว้ที่นี่ว่าผู้ให้บริการข้อมูลบางรายไม่สนับสนุนคุณสมบัตินี้ดังนั้นควรระมัดระวังเมื่อใช้งาน
เช่นเดียวกับคุณสมบัติ AbsolutePosition คุณสมบัติ AbsolutePage เริ่มต้นด้วย 1 ถ้าบันทึกปัจจุบันเป็นแถวแรกของ recordSet, AbsolutePage คือ 1 คุณสมบัติ AbsolutePage สามารถตั้งค่าให้ย้ายไปยังตำแหน่งบันทึกแถวแรกของหน้าระบุ
4. ทรัพย์สินสัมบูรณ์
หากคุณต้องการกำหนดตำแหน่งปัจจุบันของตัวชี้วัดในชุดบันทึกคุณสามารถใช้คุณสมบัติ AbsolutePosition
ค่าของคุณสมบัติ AbsolutePosition คือตำแหน่งของตัวบ่งชี้ปัจจุบันที่สัมพันธ์กับการทำธุรกรรมครั้งแรกซึ่งเริ่มต้นจาก 1 นั่นคือ AbsolutePosition ของธุรกรรมแรกคือ 1
โปรดทราบว่าเมื่อเข้าถึงชุดบันทึกไม่มีการรับประกันว่าชุดบันทึกจะปรากฏในลำดับเดียวกันทุกครั้ง
ในการเปิดใช้งาน AbsolutePosition คุณต้องตั้งค่าให้ใช้เคอร์เซอร์ผู้ใช้ (ตัวชี้) ก่อนและรหัส ASP มีดังนี้:
rs2.cursorLocation = 3
5. ทรัพย์สิน Pagecount
ใช้คุณสมบัติ PageCount เพื่อกำหนดจำนวนหน้าข้อมูลที่มีวัตถุบันทึกชุด หน้านี้เป็นชุดข้อมูลบันทึกและขนาดของมันเท่ากับการตั้งค่าของหน้าเว็บ . จะต้องสังเกตว่าผู้ให้บริการข้อมูลบางรายไม่สนับสนุนคุณสมบัตินี้
6. หน้าทรัพย์สิน
คุณสมบัติหน้าเว็บเป็นกุญแจสำคัญในการพิจารณาว่า ADO มีส่วนร่วมอย่างไรเมื่อเข้าถึงฐานข้อมูล ตั้งค่าและสร้างขนาดหน้าเพื่อให้คุณสมบัติ AbsolutePage ถูกย้ายไปยังระเบียนแรกของหน้าตรรกะอื่น ๆ สามารถตั้งค่าคุณสมบัติหน้าเว็บได้ตลอดเวลา
7. สมบัติ RecordCount
นี่เป็นคุณสมบัติที่พบได้ทั่วไปและสำคัญมาก ตัวอย่างเช่น: < %totle = rs.recordcount %>
หลังจากทำความเข้าใจกับคุณสมบัติและวิธีการของวัตถุชุดบันทึกแล้วลองพิจารณาวิธีการใช้เพื่อให้บรรลุวัตถุประสงค์ของการแสดงการปนเปื้อนของเรา ก่อนอื่นเราสามารถตั้งค่าสำหรับคุณสมบัติหน้าเว็บดังนั้นการระบุจำนวนแถวที่ประกอบไปด้วยหน้าบันทึกจากกลุ่มบันทึก; เพื่อให้ได้หมายเลขทั้งหมดที่แสดงในหน้านี้ ดูเหมือนว่าจะไม่ซับซ้อนมาก
เราได้สร้างแอปพลิเคชัน BBS อย่างง่ายซึ่งมีห้าฟิลด์ในฐานข้อมูล: ID, จำนวนอัตโนมัติของแต่ละโพสต์ เวลาโพสต์ DSN ของฐานข้อมูลคือ BBS เราวางขั้นตอนทั้งหมดในการแสดงโพสต์เพจในกระบวนการที่เรียกว่า showlist () เพื่อการโทรง่าย ขั้นตอนมีดังนี้:
-
- '---- BBS แสดงโพสต์เพจ ---
- <%subshowlist ()%>
- -
- pgsz = 20 'สวิตช์การตั้งค่าระบุจำนวนโพสต์ที่แสดงในแต่ละหน้าค่าเริ่มต้นคือ 20 โพสต์ต่อหน้า
- setConn = server.createObject (adodb.connection)
- setRs = server.createObject (adodb.recordset)
- SQL = SELECT*FromMessageOrderByIdDesc
- 'สอบถามโพสต์ทั้งหมดและจัดเรียงตามลำดับย้อนกลับโดยโพสต์รหัส
- conn.openbbs
- Rs.opensql, Conn, 1,1
- ifrs.recordCount = 0 แล้ว
- Response.write <p> <enter> ขออภัยไม่มีข้อมูลที่เกี่ยวข้องในฐานข้อมูล! </enter> </p>
- อื่น
- rs.pagesize = cint (pgsz) 'ตั้งค่าของคุณสมบัติ pagesize
- Total = int (Rs.RecordCount/PGSZ*-1)*-1'Calculate จำนวนหน้าทั้งหมดที่สามารถแสดงได้
- pageno = คำขอ (pageno)
- ifpageno = จากนั้น
- Pageno = 1
- อื่น
- pageno = pageno+1
- pageno = pageno-1
- endif
- scrollaction = คำขอ (scrollaction)
- IfScrollaction = หน้าก่อนหน้าแล้ว
- pageno = pageno-1
- endif
- IfScrollaction = หน้าถัดไปแล้ว
- pageno = pageno+1
- endif
- Ifpageno <1 จากนั้น
- Pageno = 1
- endif
- n = 1
- Rs.absolutePage = pageno
- Response.write <enter>
- ตำแหน่ง = rs.pagesize*pageno
- PageBegin = ตำแหน่ง rs.pagesize+1
- Ifposition <rs.recordcountthen
- pagend = ตำแหน่ง
- อื่น
- pagend = rs.recordcout
- endif
- response.write <p> <fontcolor = 'Navy'> <b> ผลลัพธ์การสืบค้นฐานข้อมูล: </b>
- Response.write (มีข้อมูลทั้งหมด & rs.recordcount & ชิ้นส่วนที่ตรงตามเงื่อนไข, display & pagebegin &-& pagend &) </font> </p>
- Response.write <TableWidth = 600Border = 1CellPadding = 4CellSpacing = 0BGCOLOR =#ffffff>
- response.write <trbgcolor =#5fb5e2> <fontsize = 2> <td> <b> ธีม </b> </td> <td> <b> ผู้ใช้ </b> </td> <td> <b> อีเมล </b> </td> <td> <b> วันที่เผยแพร่ </b> </td> </font> <trbgcolor =#ffffff>
- Dowhilenot (rsisnothing)
- rowCount = rs.pagesize
- dowhilenotrs.eofandrowcount> 0
- IFN = 1 จากนั้น
- response.write <trbgcolor =#ffffff>
- อื่น
- Response.write <trbgcolor =#eeeeee>
- endif
- n = 1-n%>
- <td> <spanstyle = font-size: 9pt> <ahref = 'view.asp? key = <%= rs (id)%>'> <%= rs (หัวเรื่อง)%> </a> </span> </td>
- <td> <panstyle = font-size: 9pt> <%= rs (ชื่อ)%> </a> </span> </td>
- <td> <spanstyle = font-size: 9pt> <ahref = mailto: <%= rs (อีเมล)%>> <%= rs (อีเมล)%> </a> </span> </td>
- <td> <panstyle = font-size: 9pt> <%= rs (postdate)%> </span> </td>
- </tr>
- -
- rowCount = rowCount-1
- Rs.Movenext
- วง
- setRs = Rs.NexTreCordSet
- วง
- conn.close
- setrs = ไม่มีอะไร
- setConn = ไม่มีอะไร
- -
- </table>
- <formMethod = getAction = list.asp>
- <inputType = hiddenname = pagenovalue = <%= pageno%>>
- -
- Ifpageno> 1 จากนั้น
- response.write <inputType = submitName = 'scrollaction'value =' หน้าก่อนหน้า '>
- endif
- ifrowCount = 0andPageno <> totalthen
- response.write <inputType = submitName = 'scrollaction'value =' หน้าถัดไป '>
- endif
- Response.write </form>
- endif
- -
- <%enderdub%>