??xml version="1.0" encoding="utf-8" standalone="yes"?>
二、根据客L指示Q每ơ分别从W合查询条g的记录中规定数目的记录数读取出来ƈ昄?nbsp;
两者的主要差别在于前者是一ơ性将所有记录都d内存然后再根据指C来依次做判断分析从而达到分|C的效果Q而后者是先根据指C做出判断ƈ规定数目的W合查询条g的记录读入内存,从而直接达到分|C的功能?nbsp;
我们可以很明昄感觉刎ͼ当数据库中的记录数达C万或更多ӞW一U方法的执行效率明显低于第二种ҎQ因为当每一个客h询页面时都要所有符合条件的记录存放在服务器内存中,然后在进行分늭处理Q如果同时有过 100 个的客户在线查询Q那?nbsp; ASP 应用E序的执行效率将大受影响。但是,当服务器上数据库的记录数以及同时在线的h数ƈ不是很多Ӟ两者在执行效率上是相差无几的,此时一般就采用W一U方法,因ؓW一U方法的 ASP E序~写相对W二U方法要单明了得多?nbsp;
在这里作者就以我们常见的 ASP BBS E序ZQ来l大家分析一下如何在 BBS E序里实现分|C功能,׃我们一般用的 BBS E序的数据库记录数和同时讉K的h数都不会太多Q所以以下程序实例是使用的先前所介绍的第一U分|C方法?nbsp;
q行 ADO 存取数据库时的分|C,其实是?nbsp; Recordset 的记录进行操作。所以我们首先必M?nbsp; Reordset 对象的属性和ҎQ?nbsp;
BOF 属性:目前指标指到 RecordSet 的第一W;
EOF 属性:目前指标指到 RecordSet 的最后一W;
Move ҎQ移动指标到 RecordSet 中的某一条记录;
AbsolutePage 属性:讑֮当前记录的位|是位于哪一;
AbsolutePosition 属性:目前指标?nbsp; RecordSet 中的位置Q?nbsp;
PageCount 属性:昄 Recordset 对象包括多少“?#8221;的数据;
PageSize 属性:昄 Recordset 对象每一|C的记录敎ͼ
RecordCount 属性:昄 Recordset 对象记录的L?nbsp;
下面让我们来详细认识一下这些重要的属性和Ҏ
一、BOF与EOF属?nbsp;
通常我们在ASPE序中编写代码来验BOF与EOF属性,从而得知目前指标所指向?nbsp; RecordSet的位|,使用BOF与EOF属性,可以得知一?nbsp; Recordset 对象是否包含有记录或者得知移动记录行是否已经出该Recordset 对象的范围?nbsp;
如: < % if not rs.eof then ... %>
< % if not (rs.bof and rs.eof) %>
若当前记录的位置是在一?nbsp; Recordset 对象W一行记录之前时Q?nbsp; BOF属性返?nbsp; trueQ反之则q回 false?nbsp;
若当前记录的位置是在一?nbsp; Recordset 对象最后一行记录之后时Q?nbsp; EOF 属性返?nbsp; trueQ反之则q回 false?nbsp;
BOF与EOF都ؓFalseQ表C指标位?nbsp; RecordSet 的当中?nbsp;
BOF?nbsp; TrueQ目前指标指?nbsp; RecordSet 的第一W记录?nbsp;
EOF?nbsp; TrueQ目前指标指?nbsp; RecordSet 的最后一W记录?nbsp;
BOF?nbsp; EOF 都ؓ TrueQ在 RecordSet 里没有Q何记录?nbsp;
二?nbsp; Move Ҏ
您可以用 Move ҎUd指标?nbsp; RecordSet 中的某一W记录,语法如下Q?nbsp;
rs.Move NumRecords,Start
q里?#8220;rs”Z个对象变量,表示一个想要移动当当前记录位置的Recordset 对象Q?#8220;NumRecords”是一个正负数q算式,讑֮当前记录位置的移动数目;“start”是一个可选的目Q用来指定记录v始的标签?nbsp;
所有的 Recordset 对象都支?nbsp; Move ҎQ如?nbsp; NumRecords 参数大于Ӟ当前记录位置向末方向UdQ如果其于Ӟ则当前记录位|向开头的方向UdQ如果一个空?nbsp; Recordset 对象调用 Move ҎQ将会生一个错误?nbsp;
MoveFirst ҎQ将当前记录位置U至W一W记录?nbsp;
MoveLast ҎQ将当前记录位置U至最后一W记录?nbsp;
MoveNext ҎQ将当前记录位置U至下一W记录?nbsp;
MovePrevious ҎQ将当前记录位置U至上一W记录?nbsp;
Move [n] ҎQ移动指标到W?nbsp; n W记录, n ?nbsp; 0 v?nbsp;
三?nbsp; AbsolutePage 属?nbsp;
AbsolutePage 属性设定当前记录的位置是位于哪一늚|~号Q?nbsp;
使用 PageSize 属性将 Recordset 对象分割为逻辑上的|Q每一늚记录Cؓ PageSize( 除了最后一可能会有少?nbsp; PageSize 的记录数 )。这里必L意ƈ不是所有的数据提供者都支持此项属性,因此使用时要心?nbsp;
?nbsp; AbsolutePosition 属性相同, AbsolutePage 属性是?nbsp; 1 v始的Q若当前记录?nbsp; Recordset 的第一行记录, AbsolutePage ?nbsp; 1。可以设?nbsp; AbsolutePage 属性,以移动到一个指定页的第一行记录位|?nbsp;
四?nbsp; AbsolutePosition 属?nbsp;
若您需要确定目前指标在 RecordSet 中的位置Q您可以用AbsolutePosition 属性?nbsp;
AbsolutePosition 属性的数gؓ目前指标相对於第一W的位置Q由1vQ即W一W的 AbsolutePosition ?nbsp; 1?nbsp;
注意 , 在存?nbsp; RecordSet Ӟ无法保证 RecordSet 每次都以同样的顺序出现?nbsp;
若要启用 AbsolutePositionQ必d讑֮Z用用Lcursor( 指针 )Q?nbsp; asp 码如下:
rs2.CursorLocation = 3
五?nbsp; PageCount 属?nbsp;
使用 PageCount 属性,军_ Recordset 对象包括多少“?#8221;的数据。这里的“?#8221;是数据记录的集合Q大等?nbsp; PageSize 属性的讑֮Q即使最后一늚记录数比 PageSize 的值少Q最后一也是 PageCount 的一c必L意也q不是所有的数据提供者都支持此项属性?nbsp;
六?nbsp; PageSize 属?nbsp;
PageSize 属性是军_ ADO 存取数据库时如何分页昄的关键,使用它就可以军_多少记录l成一个逻辑上的“一?#8221;。设定ƈ建立一个页的大,从而允怋?nbsp; AbsolutePage 属性移到其它逻辑늚W一条记录?nbsp;
PageSize 属性能随时被设定?nbsp;
七?nbsp; RecordCount 属?nbsp;
q也是一个非常常用和重要的属性,我们常用 RecordCount 属性来扑և一?nbsp; Recordset 对象包括多少条记录。如Q?nbsp;
< % totle=RS.RecordCount %>
在了解了 Recordset 对象的以上属性和Ҏ后,我们来考虑一下,如何q用它们来达到我们分|C的目的。首先,我们可以?nbsp; PageSize 属性设|一个|从而指定从记录l中取出的构成一个页的行敎ͼ然后通过RecordCount 属性来定记录的LQ再用记录L除以 PageSize 可得到所昄的页面LQ最后通过 AbsolutePage 属性就能完成对指定늚讉K?br />
W二U:
比如建立q样一个简单的 BBS 应用E序Q它的数据库中分别有以下五个字段Q?#8220;ID”Q每个帖子的自动~号Q?#8220;subject”Q每个帖子的主题Q?nbsp;
“name”Q加帖用L姓名Q?#8220;email”Q用L电子邮g地址Q?nbsp;
“postdate”Q加帖的旉。数据库?nbsp; DSN ?#8220;bbs”。我们将昄帖子分页的所有步骤放在一个名?#8220;ShowList()”的过E中Q方便调用?nbsp;
E序如下Q?nbsp;
'----BBS 昄帖子分页----
< % Sub ShowList() %>
< %
PgSz=20 '讑֮开养I指定每一|昄的帖子数目,默认?0帖一?nbsp;
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
sql = "SELECT * FROM message order by ID DESC"
'查询所有帖子,q按帖子的ID倒序排列
Conn.Open "bbs"
RS.open sql,Conn,1,1
If RS.RecordCount=0 then
response.write "< P>< center>对不P数据库中没有相关信息Q?nbsp;
< /center>< /P>"
else
RS.PageSize = Cint(PgSz) '讑֮PageSize属性的?nbsp;
Total=INT(RS.recordcount / PgSz * -1)*-1 '计算可显C页面的L
PageNo=Request("pageno")
if PageNo="" Then
PageNo = 1
else
PageNo=PageNo+1
PageNo=PageNo-1
end if
ScrollAction = Request("ScrollAction")
if ScrollAction = " 上一?nbsp; " Then
PageNo=PageNo-1
end if
if ScrollAction = " 下一?nbsp; " Then
PageNo=PageNo+1
end if
if PageNo < 1 Then
PageNo = 1
end if
n=1
RS.AbsolutePage = PageNo
Response.Write "< CENTER>"
position=RS.PageSize×PageNo
pagebegin=position-RS.PageSize+1
if position < RS.RecordCount then
pagend=position
else
pagend= RS.RecordCount
end if
Response.Write "< P>< font color='Navy'>< B>数据库查询结?< /B>"
Response.Write "(共有"&RS.RecordCount &"条符合条件的信息,
昄"&pagebegin&"-"&pagend&")< /font>< /p>"
Response.Write "< TABLE WIDTH=600 BORDER=1 CELLPADDING=4
CELLSPACING=0 BGCOLOR=#FFFFFF>"
Response.Write "< TR BGCOLOR=#5FB5E2>< FONT SIZE=2>< TD>
< B>主题< /B>< /TD>< TD>< B>用户< /B>< /TD>< TD>< B>Email< /B>
< /TD>< TD>< B>发布日期< /B>< /TD>< /FONT>< TR BGCOLOR=#FFFFFF>"
Do while not (RS is nothing)
RowCount = RS.PageSize
Do While Not RS.EOF and rowcount > 0
If n=1 then
Response.Write "< TR BGCOLOR=#FFFFFF>"
ELSE
Response.Write "< TR BGCOLOR=#EEEEEE>"
End If
n=1-n %>
< TD>< span style="font-size:9pt">
< A href='view.asp?key=< % =RS("ID")%>'>< % =RS("subject")%>
< /A>< /span>< /td>
< TD>< span style="font-size:9pt">
< % =RS("name")%>< /A>< /span>< /td>
< TD>< span style="font-size:9pt">
< a href="mailto:< % =RS("email")%>">< % =RS("email")%>< /a>
< /span> < /TD>
< TD>< span style="font-size:9pt">
< % =RS("postdate")%>< /span> < /td>
< /TR>
< %
RowCount = RowCount - 1
RS.MoveNext
Loop
set RS = RS.NextRecordSet
Loop
Conn.Close
set rs = nothing
set Conn = nothing
%>
< /TABLE>
< FORM METHOD=GET ACTION="list.asp">
< INPUT TYPE="HIDDEN" NAME="pageno" VALUE="< % =PageNo %>">
< %
if PageNo > 1 Then
response.write "< INPUT TYPE=SUBMIT NAME='ScrollAction'
VALUE=' 上一?nbsp; '>"
end if
if RowCount = 0 and PageNo < >Total then
response.write "< INPUT TYPE=SUBMIT NAME='ScrollAction'
VALUE=' 下一?nbsp; '>"
end if
response.write "< /FORM>"
End if
%>
< % End Sub %>
怿大家都应该能完全L上面的程序,因此׃在此详细解释了。值得注意的是在这D늨序中q用了一个小技?nbsp; < INPUT TYPE="HIDDEN" NAME="pageno" VALUE="< % =PageNo %>">Q这是用来在每次调用该ASP 文g时传递数据的“暗道”Q由于我们需要在每次调用E序时传递代表当前页码的参数Q可能大家会惛_使用 sessionQ但是从节省pȝ资源和通用性来Ԍ用这样一个隐藏的 form 来传递数据将会达到更好的效果?nbsp;
ALT是设|?#8220;囑փ标签辅助功能属?#8221;对话框选项Q?
此对话框用于讄囑փ标签辅助功能选项。根据需要,可以输入一Ҏ两项属性。屏q阅d会朗d像的 Alt 属性?
若要讄囑փ标签辅助功能选项Q具体操作如下:
?#8220;Alt”文本框中Qؓ囑փ输入一个名U或一D늮短描q?
屏幕阅读器会朗读您在此处输入的信息。您的输入应限制?50 个字W左叟뀂对于较长的描述Q请考虑?#8220;长描q?#8221;文本框中提供链接Q指向提供该囑փ更多信息的文件?
?#8220;长描q?#8221;文本框中Q输入当用户单击囑փ时显C的文g的位|,或者单L件夹图标以浏览到该文件?
该文本框提供指向与图像相养I或提供有兛_像的更多信息Q的文g的链接?
单击“定”?注意
当您?#8220;取消”Ӟ该图像将出现在文档中Q但 Dreamweaver 不会它与辅助功能标{或属性相兌?/pre>
]]>
ResultSet
对象的第一行之前,而isAfterLast()的作用是获取光标是否位于?ResultSet
对象的最后一行之后,若这两个得到的值相{,则说明rs获得的内容ؓI;注意一Ҏrs获得的内容的判断不能用null来进行判断,若用,则不能实现所要的l果?