ASP查询分页显示

Author: 惊鸿 Date: 2000年 第21期

  数据库查询是网络编程中最常用的功能之一,在一个实用的商业网站中,一次查询的结果很可能多达数百条记录,单屏显示极不方便,因此需要用到分页显示技术。ASP配合ADO的RecordSet对象,提供了一个实现分页的简明途径,下面就一段示例代码进行详解。
  在解说之前,做如下假设:将以下代码存为pagelist.asp,并在同一目录下建一数据库studentlib.mdb,库中有表student01,含三个字段,即“学号”、“姓名”和“班级”,然后输入相应记录即可。将pagelist.asp与studentlib.mdb同置于Web服务器虚拟目录下,即能用浏览器观察结果了。
  <%=″<p><center><font color=#FF00FF><b>记录查询分页显示</b></font></center><p>″%>
  <%
  PSize=5 ′指定每一页所显示的记录数目。
  Set Conn = Server.CreateObject(″ADODB.Connection″)
  Set Rs_main = Server.CreateObject(″ADODB.RecordSet″)
   ′ADODB.RecordSet类提供了访问数据库的便捷方法,此处建立它的实例并赋予变量Rs_mainDBPath = Server.MapPath(″studentlib.mdb″)。
  ′Server是ASP内置对象,此处用其MapPath方法将所用数据库的相对路径映射为物理路径conn.Open ″driver={Microsoft Access Driver (*.mdb)};dbq=″ & DBPath。
  ′这里直接指定了数据源,也可以在“控制面板”中的“32位ODBC”中建立数据源,并在此处使用conn.Open ″数据源名″。
  sql = ″SELECT * FROM student01 order by 学号″
  ′查询所有记录,并按记录的学号排列,实际应用中,你可用从表单获取的查询字符串来代替它。
  Rs_main.open sql,Conn,1,1
    ′以只读方式打开数据源并执行查询,如果是写方式则应该是Rs_mian.open sql,Conn,1,3。
  If Rs_main.RecordCount=0 then
  response.write ″<P><center>对不起,数据库中没有相关信息!</center></P>″
  else
  Rs_main.PageSize = Cint(PSize)
   ′设定PageSize属性的值,这是RecordSet对象进行分页显示最重要的属性,指定它也就指定了每页显示的记录数,同时也就等于指定了其另一属性PageCount,即总页数的值,这样就完成了在逻辑上对查询结果的分页。
  PageN=Request(″tempage″)
  if PageN=″″ Then
  PageN = 1
  end if
  SA = Request(″Coms″)
  if SA = ″ 上一页 ″ Then
  PageN=PageN-1
  elseif SA = ″ 下一页 ″ Then
  PageN=PageN+1
  elseif SA = ″ 确  定 ″ Then
  PageN=Request(″p″)
  ′此处容错略,应防止传来不合范围的页号。
  end if
  ′以上几句用来确定要显示的页号。在本程序的最后设了一个表单,包括上下页按钮,接收用户键入页号的文本框及一个隐藏元素,都是用来传递页号的。
  Rs_main.AbsolutePage = PageN
  ′将页号赋予AbsolutePage属性。这是分页显示中又一个关键属性,将页号赋予它的作用便是当前记录指针被移到了该页的首条记录上。
  Response.Write ″<CENTER>″
  pagebegin=Rs_main.PageSize*(PageN-1)+1
  if Rs_main.PageSize*PageN < Rs_main.RecordCount then
  pagend=Rs_main.PageSize*PageN
  else
  pagend= Rs_main.RecordCount
  end if
  ′计算当前页记录的起始和终止位置。注意,这里得到的两个值是从1开始的,仅是供显示用,告诉用户当前显示的是从第几条到第几条,而不是真正的记录号,真正的记录号是从0开始的。
  n=1′配合下面的n=1-n句,轮换表格背景色,提高显示效果。
  Total=Rs_main.PageCount ′将总页数赋予Total。
  Response.Write ″<P><font color=#FF00FF><B>数据库查询结果:</B>″
  Response.Write ″(共有″&Rs_main.RecordCount&″条符合条件的信息,分″&Total&″页,显示第″&PageN&″页[″&pagebegin&″-″&pagend&″])</font></p>″Response.Write ″<TABLE WIDTH=620 BORDER=1 CELLPADDING=4 CELLSPACING=0 BGCOLOR=#FFFFFF>″
  Response.Write ″<TR BGCOLOR=#AABBFF><FONT SIZE=2><TD><B>学号</B></TD><TD><B>姓名</B></TD><TD><B>班级</B></TD></FONT><TR BGCOLOR=#FFFFFF>″
  ′以上显示查询信息和表头。
  RC = Rs_main.PageSize ′将每页记录数赋予RC作为循环变量。
  Do While Not Rs_main.EOF and RC > 0 
  If n=1 then
  Response.Write ″<TR BGCOLOR=#FFFFFF>″
  ELSE
  Response.Write ″<TR BGCOLOR=#EEEEEE>″
  End If
  n=1-n %>
  <TD><% =Rs_main(″学号″)%></TD>
  <TD><% =Rs_main(″姓名″)%></TD>
  <TD><% =RS_main(″班级″)%></TD>
  </TR>
  <%
  RC = RC - 1
  Rs_main.MoveNext
  Loop
  ′以上循环在表格中显示查询结果中的当前页所有记录,RecordSet对象(″字段名″)代表的即为当前记录中该字段的值。MoveNext方法为移动指针到下条记录,相应还有:MovePrev(移到上一记录)MoveFirst(移到第一条记录)MoveLast(移到最后一条记录)等。
  Conn.Close
  set Rs_main = nothing
  set Conn = nothing
  %>
  ′以上关闭与释放各对象引用。
  </TABLE>
  <FORM METHOD=GET ACTION=″pagelist.asp″>
  <INPUT TYPE=″HIDDEN″ NAME=″tempage″ VALUE=″<% =PageN %>″>
  ′此隐藏元素是为了将本次显示的页号传到下次显示中去,即下次显示的页号是根据用户所按上下页按钮的不同而用本次页号增减所得。
  <% 
  if PageN > 1 Then
  response.write ″<INPUT TYPE=SUBMIT NAME=′Coms′ VALUE=′ 上一页 ′>″
  ′页号大于1才显示“上一页”按钮。
  end if
  if PageN <>Total then
  response.write ″<INPUT TYPE=SUBMIT NAME=′Coms′ VALUE=′ 下一页 ′>″
  ′不是最后一页才显示“下一页”按钮。
  end if
  response.write ″<BR>″
  response.write ″显示第<INPUT TYPE=TEXT NAME=′p′ size=5>页″
  response.write ″<INPUT TYPE=SUBMIT NAME=′Coms′ VALUE=′ 确  定 ′>″
  ′文本框加上“确定”按钮给用户提供了直接跳到指定页号的界面。
  response.write ″</FORM>″
  ′以上这个表单,综合提供给了用户查看不同页面的手段。
  end if
  %>
  怎么样,看到查询结果一页页显示出来时,你是否会很开心呢?这里只是用ACCESS数据库做个例子,真正应用中,你也可以把它用在SQL Server或ORACLE数据库中。好了,有什么疑问的话,请和我联系,我的E-mail是:netsurf@990.net