在 Active Server Pages (ASP) 应用程序中显示大型记录集,很可能是您熟悉的一个问题。本文对此问题及其解决方案和示例代码进行了深入探讨,这个示例代码经过简单修改,就可以应用于您的具体情况。该示例代码被设计成服务器端的解决方案,它与浏览器无关。另外,我会指出您在设计自己的解决方案时需要考虑的问题。
'写出记录的当前页 Do While (Not rst.EOF) and (iLoop <= iRowsPerPage) Response.Write "<TR>" For Each fld in rst.Fields Response.Write "<TD>" & fld.value & "</TD>" Next iLoop = iLoop + 1 rst.MoveNext Response.Write "</TR>" Loop Response.Write "</TABLE>" End Sub
Sub ShowNavBar(rst) Dim iPageCount Dim iLoop Dim sScriptName
If iPageNum > 1 Then Response.Write " <a href=" & sScriptName & "?iPageNum=" Response.Write (iPageNum -1) & "><< Previous</a>" End If
iPageCount = rst.PageCount Do Until iLoop > iPageCount f iLoop = iPageNum Then Response.Write " <B>" & CStr(iLoop) & "</B>" Else Response.Write " <a href=" & sScriptName & "?iPageNum=" & _ Cstr(iLoop) & ">" & iLoop & "</a>" End If iLoop = iLoop + 1 Loop
If Not rst.EOF Then Response.Write " <a href=" & sScriptName & "?iPageNum=" Response.Write (iPageNum +1) & "> Next >></a><BR>" Else Response.Write "<BR>" End If
Response.Write "Page " & iPageNum & " of " & iPageCount & "<BR>" Response.Write rst.RecordCount & " Records" 牋? End Sub
Sub ShowFastNavBar(rst) Dim iPageCount Dim iLoop Dim sScriptName
If iPageNum > 1 Then Response.Write " <a href=" & sScriptName & "?iPageNum=" Response.Write (iPageNum -1) & "><< Previous</a>" End If
If Not rst.EOF Then Response.Write " <a href=" & sScriptName & "?iPageNum=" Response.Write (iPageNum +1) & "> Next >></a><BR>" Else Response.Write "<BR>" End If
Response.Write "Page " & iPageNum
End Sub
Sub CleanUp(rst) If Not rst Is Nothing then If rst.state = adStateOpen then rst.close set rst = nothing End If End Sub
</SCRIPT> 分析
设计分页解决方案时,需注意的几个问题:
游标定位问题。如果使用客户端游标,每次打开记录集时,将读取所有的记录。因此,由于读取了所有的记录,以后访问 RecordCount 或 PageCount 属性时将很快。如果您使用服务器端游标,将只检索需要的记录。您可以通过 CacheSize 属性指定一次要读取的记录数来提高性能。然而,如果您使用服务器端游标,和 RecordCount 或 PageCount 属性,则将读取所有的记录,性能得不到提高。必须在具有更多信息和更丰富导航的用户界面,与检索所有记录的性能影响之间折衷。 使用服务器端游标时,CursorType 属性必须是 adOpenStatic 或 adOpenKeyset,才能使用分页。 分页并非总是最好的用户页面。它可能仅适用于用户正从搜索引擎扫描结果或浏览产品目录的情况。 试将记录分类,以使更相关的记录出现在前几页中(例如,使用 SQL 的 ORDER BY 子句)。用户所能做的就这么多。 只检索需要显示的列(即,避免 SELECT *)。 只检索需要显示的记录。确保过滤的条件(即,使用 WHERE 子句)。 以下是需要牢记的几点提示:
将您的逻辑封装在方法中。使用方法可将表示逻辑和数据访问逻辑分离,这就简化了将代码装入 Windows 脚本组件、Visual Basic 脚本编辑 (VBScript) 类或组件的工作。改变功能更容易了,代码维护也得以改进。测试和调试也因可以注释和取消注释方法调用而得到改进。 与包括 ADOVBS.INC 相比,引用 ADO 的 TypeLibrary 是更好的解决方案。这是因为 ASP 在处理包含文件时,是将整个文件读入内存,而不是只读入它需要的部分。 结论
分页是一项通用技术,许多 Web 应用程序用它来提供浏览大量记录的好方法。在设计分页解决方案时,需要考虑一些问题,如,如何检索记录,需要提供什么类型的用户导航。尽管最好的解决方案取决于您的具体的应用程序,使用本文中的技术将帮助您作出更好的设计决策
在 Active Server Pages (ASP) 应用程序中显示大型记录集,很可能是您熟悉的一个问题。本文对此问题及其解决方案和示例代码进行了深入探讨,这个示例代码经过简单修改,就可以应用于您的具体情况。该示例代码被设计成服务器端的解决方案,它与浏览器无关。另外,我会指出您在设计自己的解决方案时需要考虑的问题。
'写出记录的当前页 Do While (Not rst.EOF) and (iLoop <= iRowsPerPage) Response.Write "<TR>" For Each fld in rst.Fields Response.Write "<TD>" & fld.value & "</TD>" Next iLoop = iLoop + 1 rst.MoveNext Response.Write "</TR>" Loop Response.Write "</TABLE>" End Sub
Sub ShowNavBar(rst) Dim iPageCount Dim iLoop Dim sScriptName
If iPageNum > 1 Then Response.Write " <a href=" & sScriptName & "?iPageNum=" Response.Write (iPageNum -1) & "><< Previous</a>" End If
iPageCount = rst.PageCount Do Until iLoop > iPageCount f iLoop = iPageNum Then Response.Write " <B>" & CStr(iLoop) & "</B>" Else Response.Write " <a href=" & sScriptName & "?iPageNum=" & _ Cstr(iLoop) & ">" & iLoop & "</a>" End If iLoop = iLoop + 1 Loop
If Not rst.EOF Then Response.Write " <a href=" & sScriptName & "?iPageNum=" Response.Write (iPageNum +1) & "> Next >></a><BR>" Else Response.Write "<BR>" End If
Response.Write "Page " & iPageNum & " of " & iPageCount & "<BR>" Response.Write rst.RecordCount & " Records" 牋? End Sub
Sub ShowFastNavBar(rst) Dim iPageCount Dim iLoop Dim sScriptName
If iPageNum > 1 Then Response.Write " <a href=" & sScriptName & "?iPageNum=" Response.Write (iPageNum -1) & "><< Previous</a>" End If
If Not rst.EOF Then Response.Write " <a href=" & sScriptName & "?iPageNum=" Response.Write (iPageNum +1) & "> Next >></a><BR>" Else Response.Write "<BR>" End If
Response.Write "Page " & iPageNum
End Sub
Sub CleanUp(rst) If Not rst Is Nothing then If rst.state = adStateOpen then rst.close set rst = nothing End If End Sub
</SCRIPT> 分析
设计分页解决方案时,需注意的几个问题:
游标定位问题。如果使用客户端游标,每次打开记录集时,将读取所有的记录。因此,由于读取了所有的记录,以后访问 RecordCount 或 PageCount 属性时将很快。如果您使用服务器端游标,将只检索需要的记录。您可以通过 CacheSize 属性指定一次要读取的记录数来提高性能。然而,如果您使用服务器端游标,和 RecordCount 或 PageCount 属性,则将读取所有的记录,性能得不到提高。必须在具有更多信息和更丰富导航的用户界面,与检索所有记录的性能影响之间折衷。 使用服务器端游标时,CursorType 属性必须是 adOpenStatic 或 adOpenKeyset,才能使用分页。 分页并非总是最好的用户页面。它可能仅适用于用户正从搜索引擎扫描结果或浏览产品目录的情况。 试将记录分类,以使更相关的记录出现在前几页中(例如,使用 SQL 的 ORDER BY 子句)。用户所能做的就这么多。 只检索需要显示的列(即,避免 SELECT *)。 只检索需要显示的记录。确保过滤的条件(即,使用 WHERE 子句)。 以下是需要牢记的几点提示:
将您的逻辑封装在方法中。使用方法可将表示逻辑和数据访问逻辑分离,这就简化了将代码装入 Windows 脚本组件、Visual Basic 脚本编辑 (VBScript) 类或组件的工作。改变功能更容易了,代码维护也得以改进。测试和调试也因可以注释和取消注释方法调用而得到改进。 与包括 ADOVBS.INC 相比,引用 ADO 的 TypeLibrary 是更好的解决方案。这是因为 ASP 在处理包含文件时,是将整个文件读入内存,而不是只读入它需要的部分。 结论
分页是一项通用技术,许多 Web 应用程序用它来提供浏览大量记录的好方法。在设计分页解决方案时,需要考虑一些问题,如,如何检索记录,需要提供什么类型的用户导航。尽管最好的解决方案取决于您的具体的应用程序,使用本文中的技术将帮助您作出更好的设计决策
在 Active Server Pages (ASP) 应用程序中显示大型记录集,很可能是您熟悉的一个问题。本文对此问题及其解决方案和示例代码进行了深入探讨,这个示例代码经过简单修改,就可以应用于您的具体情况。该示例代码被设计成服务器端的解决方案,它与浏览器无关。另外,我会指出您在设计自己的解决方案时需要考虑的问题。
'写出记录的当前页 Do While (Not rst.EOF) and (iLoop <= iRowsPerPage) Response.Write "<TR>" For Each fld in rst.Fields Response.Write "<TD>" & fld.value & "</TD>" Next iLoop = iLoop + 1 rst.MoveNext Response.Write "</TR>" Loop Response.Write "</TABLE>" End Sub
Sub ShowNavBar(rst) Dim iPageCount Dim iLoop Dim sScriptName
If iPageNum > 1 Then Response.Write " <a href=" & sScriptName & "?iPageNum=" Response.Write (iPageNum -1) & "><< Previous</a>" End If
iPageCount = rst.PageCount Do Until iLoop > iPageCount f iLoop = iPageNum Then Response.Write " <B>" & CStr(iLoop) & "</B>" Else Response.Write " <a href=" & sScriptName & "?iPageNum=" & _ Cstr(iLoop) & ">" & iLoop & "</a>" End If iLoop = iLoop + 1 Loop
If Not rst.EOF Then Response.Write " <a href=" & sScriptName & "?iPageNum=" Response.Write (iPageNum +1) & "> Next >></a><BR>" Else Response.Write "<BR>" End If
Response.Write "Page " & iPageNum & " of " & iPageCount & "<BR>" Response.Write rst.RecordCount & " Records" 牋? End Sub
Sub ShowFastNavBar(rst) Dim iPageCount Dim iLoop Dim sScriptName
If iPageNum > 1 Then Response.Write " <a href=" & sScriptName & "?iPageNum=" Response.Write (iPageNum -1) & "><< Previous</a>" End If
If Not rst.EOF Then Response.Write " <a href=" & sScriptName & "?iPageNum=" Response.Write (iPageNum +1) & "> Next >></a><BR>" Else Response.Write "<BR>" End If
Response.Write "Page " & iPageNum
End Sub
Sub CleanUp(rst) If Not rst Is Nothing then If rst.state = adStateOpen then rst.close set rst = nothing End If End Sub
</SCRIPT> 分析
设计分页解决方案时,需注意的几个问题:
游标定位问题。如果使用客户端游标,每次打开记录集时,将读取所有的记录。因此,由于读取了所有的记录,以后访问 RecordCount 或 PageCount 属性时将很快。如果您使用服务器端游标,将只检索需要的记录。您可以通过 CacheSize 属性指定一次要读取的记录数来提高性能。然而,如果您使用服务器端游标,和 RecordCount 或 PageCount 属性,则将读取所有的记录,性能得不到提高。必须在具有更多信息和更丰富导航的用户界面,与检索所有记录的性能影响之间折衷。 使用服务器端游标时,CursorType 属性必须是 adOpenStatic 或 adOpenKeyset,才能使用分页。 分页并非总是最好的用户页面。它可能仅适用于用户正从搜索引擎扫描结果或浏览产品目录的情况。 试将记录分类,以使更相关的记录出现在前几页中(例如,使用 SQL 的 ORDER BY 子句)。用户所能做的就这么多。 只检索需要显示的列(即,避免 SELECT *)。 只检索需要显示的记录。确保过滤的条件(即,使用 WHERE 子句)。 以下是需要牢记的几点提示:
将您的逻辑封装在方法中。使用方法可将表示逻辑和数据访问逻辑分离,这就简化了将代码装入 Windows 脚本组件、Visual Basic 脚本编辑 (VBScript) 类或组件的工作。改变功能更容易了,代码维护也得以改进。测试和调试也因可以注释和取消注释方法调用而得到改进。 与包括 ADOVBS.INC 相比,引用 ADO 的 TypeLibrary 是更好的解决方案。这是因为 ASP 在处理包含文件时,是将整个文件读入内存,而不是只读入它需要的部分。 结论
分页是一项通用技术,许多 Web 应用程序用它来提供浏览大量记录的好方法。在设计分页解决方案时,需要考虑一些问题,如,如何检索记录,需要提供什么类型的用户导航。尽管最好的解决方案取决于您的具体的应用程序,使用本文中的技术将帮助您作出更好的设计决策