ASP 中的 ADO 记录集分页






4.81/5 (31投票s)
如何在 ASP 中显示多页记录
引言
我时不时会遇到在 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. 接收关键字
接收 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
请注意,我将 recordset
的 CursorLocation
属性设置为 adUseClient
(3)。我们必须这样做,才能稍后使用此 recordset
的某些属性。我省略了 CursorType
和 LockType
参数,因为默认值 adOpenForwardOnly
和 adLockReadOnly
正是我们在此情况下所需,以获得最佳性能。
4. 提供导航链接
是的,这是第四步。我将第三步(显示结果)留到了最后,因为为了显示记录,我们需要弄清楚一些事情。我也认为最好在页面顶部结果之前创建和显示导航链接。
此时,我们需要弄清楚几件事:我们的搜索是否有结果?如果有,我们有多少页结果?
可以通过检查 recordset
的 EOF
属性轻松确定是否存在结果:
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()
函数中。