日期:2011-11-07  浏览次数:21010 次


     研究RDS数据控件时,学习了如何用DATAPAGESIZE来限制绑定表中显示的记录行数。虽然这是一个既好又简单的解决方法,但其缺点是把所有数据都取到了客户端。例子中只用到了一个规模较小的数据集,但如果需要用到一个很大的数据集,结果会如何?真的想把所有数据都取到客户端吗?毕竟,用户每次只能看到一屏数据。
    这个问题的解决方法是引入分页的概念,每一次只处理一页数据,并且只返回这一页数据,而不是全部数据。为了实现分页处理数据,需要处理与Recordset对象相关的三个属性,如表1 0 - 7所示。

    可使用AbsolutePage属性将记录指针指向某页面中的第一条记录,这样可以直接在页面间移动。例如:

    如果使用缺省的页面大小1 0,上面的代码行则将记录指针指向记录集的第11条记录。
    需要着重注意的是,页面中的记录不是固定的,记录的数量是固定的,但并不是记录本身。这听起来可能不太好理解,但如果回想一下讨论光标类型的第8章内容,可能会记得某些类型的光标是基于键的。实际的数据并不会被读取到客户端,直到请求这些数据行。这样,如果正在使用分页,而其他用户增加了新的行或删除了现有的记录,那么在页面中的实际记录就可能会改变。
    同样需要记住的是,页面中记录的次序与记录集中的次序是一致的,由产生记录集的命令来定义。记录集中的记录没有记录号,因而无法确定它们在记录集中的位置。
    将分页结合到应用程序有好几种方法,其中的两种使用这些属性,第三种方法使用类似的方法,但只适用于SQL Server。
10.4.1 利用ASP页面分页记录集
    第一个要讨论的方法是在本章前面介绍过的RDS方法的一个扩展。我们将使用RDS数据控件和U R L参数,先有一个返回一组记录的A S P页面,然后这些记录由RDS数据控件使用。如果想引入分页,必须确定这个A S P页面只返回一个充满数据的页面。
    先研究提供数据的A S P页面。为使其更具有灵活性,允许一个包含两条信息的查询字符串传到页面中:

    此时,得到了一个充满数据的记录集,但仅需要一个页面。因此,必须使用A b s o l u t e P a g e属性来设置想要的页面。在设置A b s o l u t e P a g e属性之前,需要检测请求的页码不是0,或不大于总页数。在这两种情况下,将页面设为最后一页,这由P a g e C o u n t属性确定。

    现在,已经位于正确的页上,所以接下来的问题就是如何将这一页传送给客户端。为了实现这一点,只需用一个“转储”记录集把该页中的记录提取出来。创建一个新的,与含有数据的记录集相同结构的记录集,同时将数据拷贝到新的记录集中。
    转储一个记录集比较简单,包括创建一个Recordset对象,设置光标位置为基于客户端。然后将字段添加到F i e l d s集合,使用数据记录集为这些字段提供细节。一旦创建完字段,只需简单地打开记录集,不必指定任何数据源或连接的细节。


    我们用新创建的按钮来控制分页,这些按钮调用setPage方法,其参数确定要移到哪一页。



    尽管如此,这段代码存在着一个主要的问题需要解决,因为客户并不知道有多少页数据。可以很容易地直接请求到最后一页数据,但是当一页页下移时,却不知道什么时候超出最后一页。A S P页面能够知道,但在客户端却不行。这意味着即使A S P页面只显示最后一页,客户端的页号仍然在持续增加。
    使用自定义组件
    解决前面例子中的页码问题的一种方法是使用组件来提供数据,而不是A S P页面。这里不想进行仔细的研究,但这个概念非常类似。首先要清除U R L的细节,然后在r e s e t D a t a函数中使用D a t a S p a c e对象和D a t a F a c t o r y对象来创建一个自定义组件。
    这个组件所含的代码可能与A S P页面的代码非常相似,也返回一个含有数据页的记录集。但由于组件可以不止返回一个记录集,所以实际上可以跟踪页的最大数量,这使分页变得更智能化。
10.4.2 利用ADO分页
    另一个解决页码问题的方法是使用一种著名的分页技术。不采用RDS数据绑定,而是在A S P页面内创建一个H T M L表格。使用相同的分页方法,但并不转