65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP 中的 ADO 记录集分页

2000 年 6 月 22 日

CPOL
viewsIcon

583823

downloadIcon

6052

如何在 ASP 中显示多页记录

Sample Image - rsPaging.gif

引言

我时不时会遇到在 ASP 页面中显示大量记录的任务。一个很好的例子就是显示搜索结果。大多数时候,我事先不知道需要显示多少条记录。此外,随着应用程序的使用增长,数据库的规模也会相应增长。这使得我和任何有类似应用程序需求的人别无选择,只能开发某种算法来分块显示记录 - 分页。

大家都熟悉搜索引擎显示搜索结果的方式。你得到第一页结果,结果数量限制在一定数量(例如 20 条),并有一些导航链接可以转到第一页、上一页、下一页或最后一页。有些网站提供直接转到特定页码的功能,有些则混合使用。

那么,如何在 ASP 中实现记录分页机制?具体来说,我们如何使用 ADO 实现记录分页?

让我们假设我们有一个名为 tblItem 的数据库表,用于存储我们的 Item(无论它们是什么?)的信息。我还设想 tblItem 中的一个字段名为 ItemName。我们的任务是创建一个页面集,使用户能够按 ItemName 字段搜索 Item。我们决定创建两页。一页显示搜索表单,另一页显示搜索结果。

请原谅我,我将跳过所有变量声明和 HTML 格式。

第一页应该很简单。这是一个标准的 HTML 表单,可能看起来像这样:

...
<FORM ACTION="results.asp" METHOD="GET">
Item Name: <INPUT TYPE="text" NAME="Keyword"> <INPUT TYPE="submit" VALUE=" Find ">
</FORM>
...

第二页才是所有魔法发生的地方。这就是第二页(results.asp)应该能够做到的:

  1. 接收用户输入的关键字。
  2. 搜索数据库中包含关键字的记录。
  3. 显示一页结果记录。
  4. 为用户提供一些导航链接,以便在需要时显示更多结果页面。

1. 接收关键字

接收 Keyword 就像这样简单:

Keyword = Trim(Request.QueryString("Keyword"))

2. 搜索数据库中包含关键字的记录

现在,我们拥有了获取包含我们关键字的 Item 的 ItemName 的 ADO 记录集所需的一切。

首先,我们创建一个用于搜索的 SQL 语句:

SQL = "SELECT * FROM tblItem WHERE ItemName LIKE '%" & Replace(Keyword, "'", "''") & "%'"

请注意,我使用了 Replace 函数来转义搜索 string 中的单引号。如果不这样做,如果用户在 Keyword 中输入单引号,你将收到一个错误。

' Create and open ADO recordset
Set RS = Server.CreateObject("ADODB.Recordset")
RS.CursorLocation = 3 ' adUseClient
RS.Open SQL, strConnectionString

请注意,我将 recordsetCursorLocation 属性设置为 adUseClient (3)。我们必须这样做,才能稍后使用此 recordset 的某些属性。我省略了 CursorTypeLockType 参数,因为默认值 adOpenForwardOnlyadLockReadOnly 正是我们在此情况下所需,以获得最佳性能。

4. 提供导航链接

是的,这是第四步。我将第三步(显示结果)留到了最后,因为为了显示记录,我们需要弄清楚一些事情。我也认为最好在页面顶部结果之前创建和显示导航链接。

此时,我们需要弄清楚几件事:我们的搜索是否有结果?如果有,我们有多少页结果?

可以通过检查 recordsetEOF 属性轻松确定是否存在结果:

If RS.EOF Then
    RS.Close
    ... ' Clean up
    ... ' Do the no results HTML here
    Response.Write "No Items found."
    Response.End 
    ... ' Done
End If

页数显然取决于我们每页要显示的 Item 数量。

' Set the page size of the recordset
RS.PageSize = nItemsPerPage
    
' Get the number of pages
nPageCount = RS.PageCount

现在我们需要讨论当前页码。由于我们希望此页面(results.asp)能够显示任何一页结果,因此我们必须有一种方法来指定用户当前看到的是哪一页。我们将通过向我们的 results.asp 脚本传递一个附加参数来实现,我们将其称为“Page”。因此,指向我们页面的链接可能如下所示:

http://..../results.asp?Keyword=BlahBlahBlah&Page=3

话虽如此,我们可以通过简单地检查 Page 参数来确定用户请求的页码:

nPage = CLng(Request.QueryString("Page"))

我们需要确保用户请求的页码在可接受的范围内,并在必要时进行修复:

If nPage < 1 Or nPage > nPageCount Then
	nPage = 1
End If

现在,我们可以通过简单地链接到此页面,并为 Keyword 和特定页码使用相同的值来创建我们的导航链接。例如:

' First page
Response.Write "<A HREF=""results.asp?Keyword=" & Keyword & "&Page=1"">First Page</A>"
' Previous page:
Response.Write "<A HREF=""results.asp?Keyword=" & Keyword & "&Page=" & nPage - 1 & """>Prev. Page</A>"
' Next page
Response.Write "<A HREF=""results.asp?Keyword=" & Keyword & "&Page=" & nPage + 1 & """>Next Page</A>"
' Last page
Response.Write "<A HREF=""results.asp?Keyword=" & Keyword & "&Page=" & nPageCount & """>Last Page</A>"
' 15th page:
Response.Write "<A HREF=""results.asp?Keyword=" & Keyword & "&Page=15"">15th Page</A>"

3. 显示一页结果记录

我们剩下的就是显示一页结果:

' Position recordset to the correct page
RS.AbsolutePage = nPage

' Display the page of results
Do While Not ( RS.Eof Or RS.AbsolutePage <> nPage )
    Response.Write RS("ItemName") & "<br>"
    RS.MoveNext
Loop
RS.Close

就是这样。我在这里包含的示例稍微复杂一些,因为我将 HTML 搜索表单和结果显示结合在了一个 ASP 页面中。这就是为什么在每个链接中都使用了额外的 Mode 参数。所有关于显示搜索结果的代码都在 ShowResults() 函数中。

© . All rights reserved.