对于分页性能,有一个原则就是页面需要显示多少数据,我们就绐它多少数据。根据这个原则,我们可以绐出三层架构的分页解决方案。
1. 数据层
在数据层,运用分页存储过程或分页SQL查询,我们很容易可以在网上找到通用的分页存储过程,当然我们可以根据自己要的性能写出更为高效的存储过程和SQL查询语句。
概括起来,总结自定义数据分页在数据层主要包含四种方式:
1) 使用临时表――此方法被广泛使用论坛CommunityServer、博客等开源代码
2) 使用存储过程――这个方法好像最初来自CSDN上的一篇,可以到如下网址查看博客圆里的一篇文章
http://genson.cnblogs.com/archive/2006/01/17/318882.html
3) 利用SQL语句选取有限数据分页。
2. 数据访问层
在数据访问层调用存储过程或执行分页SQL查询。并在数据访问层返回集合或其它数据结构绐业务层。
一般我们在数据访问层会使用的如下数据结构到传递数据。
1) 自定义实体类
2) 数据表
3) DataSet
4) C# 2.0 泛型如List<T>其中T为自定义实体类
3. 业务层
在业务层,我们将数据访问层的数据传递绐表现层。当然数据传递的数据结构也如上面几种方法,我们可以参照MSDN上一篇文章叫《设计数据层组件并在层间传递数据》来选择合适的数据结构传递数据。
4. 表现层
其实我们在分页解决方案里最难的并不是存储过程,各层之间数据传递,这些对数据的操作是我们所熟知的。也不必费多大的劲就可以搞定这些,但在表现层就不同了,因为HTTP是无连接的协议,要在服务器上得知每个客户端正在访问第几页,将要访问第几页,每页要显示多少数据,这些需要允分了解ASP.NET的状态机制。
首先我们来看看分页时在UI层要呈现哪些东西
1) 呈现当前页的数据,这是最重要的,这些数据我们根据当前是第几页,每页显示多少条数据来查询数据库。
2) 呈现导航链接。导航链接我们根据当前页,总页数来动态的显示链接。
3) 当前页状态信息。在UI层我们可以显示总页数,当前页是第几页。当然这不是必须的。
4) 表现层的事件。在表现层当我们点击导航链接的时候,如何在服务器端捕获客户端发生的事件和客户端当前的状态并作出正确的响应。
5) 在客户端呈现的时候,我们要在客户端保存几个有用的信息,
a. 当前用户在第几页
b. 要使服务器端能从用户点击导航链接时所要的数据,即下个状态跳转到第几页。
把各层联系起来就是,在客户端所发生的分页事件在服务器端的表现层捕获后调用业务层,业务层再调用数据访问层,数据访问层再调用数据层以获取数据,层间传递的数据结构可选择。
现在来看看ASP.NET 2.0几种常见的三层分页解决方案
1) GridView +ObjectDataSource
ASP.NET2.0提供了SqlDataSource数据源控件,支持用于指定连接字符串、SQL 语句或存储过程的属性,用以查询或修改数据库。但是,SqlDataSource 控件存在一个问题:该控件的缺点在于它迫使您将用户界面层与业务逻辑层混合在一起。然而随着应用程序规模的扩大,您会越来越感觉到混合多个层的做法是不可取的。 生成严格意义上的多层 Web 应用程序时,您应该具有清晰的用户界面层、业务逻辑层和数据访问层。仅仅由于 SqlDataSource 控件的强制而在用户界面层引用 SQL 语句或存储过程是不可取的。
ObjectDataSource 控件对象模型类似于 SqlDataSource 控件。ObjectDataSource 公开一个 TypeName 属性(而不是 ConnectionString 属性),该属性指定要实例化来执行数据操作的对象类型(类名)。类似于 SqlDataSource 的命令属性,ObjectDataSource 控件支持诸如 SelectMethod、UpdateMethod、InsertMethod 和 DeleteMethod 的属性,用于指定要调用来执行这些数据操作的关联类型的方法。ObjectDataSource可以通过TypeName 属性直接调用业务层的类。
ObjectDataSource对分页的支持,在ObjectDataSource调用的业务层类中对应SelectMethod的方法中要实现ObjectDataSource的两个参数MaximumRowsParameterName, StartRowIndexParameterName。还要实现ObjectDataSource中的SelectCountMethod方法,这是查询数据总数据,以便GridView进行分页,这样在GridView指定数据源为ObjectDataSource并允许分页,设置分页的网格就可以分页了,并且ObjectDataSource会自动的根据两个参数MaximumRows, StartRowIndex来呈现GridView当前页面所要的数据,当然我们在业务层,数据访问层,数据层都要对对应的SelectMethod方法实现参数MaximumRows,StartRowIndex
2) GridView + PageIndexChanged事件
GridView有个PageIndexChanged事件,我们在页面代码中增加处理PageIndexChanged事件的方法,然后根据GridView的PageIndex,PageSize属性调用业务层相应的分页方法然后绑定数据。
3) Repeater + URL字符串参数
GridView是固定了的格式显示数据,Repeater控件是一个数据显示控件,该控件允许通过为列表中显示的每一项重复使用指定的模板来自定义布局。但是Repeater没有内建的分页功能。没有内建的分页功能,我们就要辅助实现它,常见的解决方案有,用URL字符串参数传递信息,然后在服务端数据传递过来的信息,然后进行数据绑定。
4) 数据控件 + AspNetPager分页控件
分页原理基本上一样,而且UI元素也差不多,无非就是前一页,后一页,第一页,最后一页,还有中间的几页,我们可以把这些都抽象出来,然后写一个自定义控件分页控件,分页控件定义一些属性和事件,在要用到分页的页面直接调用这个控件就可以了,根据分页控件所发生的事件调用业务层数据并绑定数据控件。
1. 数据层
在数据层,运用分页存储过程或分页SQL查询,我们很容易可以在网上找到通用的分页存储过程,当然我们可以根据自己要的性能写出更为高效的存储过程和SQL查询语句。
概括起来,总结自定义数据分页在数据层主要包含四种方式:
1) 使用临时表――此方法被广泛使用论坛CommunityServer、博客等开源代码
2) 使用存储过程――这个方法好像最初来自CSDN上的一篇,可以到如下网址查看博客圆里的一篇文章
http://genson.cnblogs.com/archive/2006/01/17/318882.html
3) 利用SQL语句选取有限数据分页。
2. 数据访问层
在数据访问层调用存储过程或执行分页SQL查询。并在数据访问层返回集合或其它数据结构绐业务层。
一般我们在数据访问层会使用的如下数据结构到传递数据。
1) 自定义实体类
2) 数据表
3) DataSet
4) C# 2.0 泛型如List<T>其中T为自定义实体类
3. 业务层
在业务层,我们将数据访问层的数据传递绐表现层。当然数据传递的数据结构也如上面几种方法,我们可以参照MSDN上一篇文章叫《设计数据层组件并在层间传递数据》来选择合适的数据结构传递数据。
4. 表现层
其实我们在分页解决方案里最难的并不是存储过程,各层之间数据传递,这些对数据的操作是我们所熟知的。也不必费多大的劲就可以搞定这些,但在表现层就不同了,因为HTTP是无连接的协议,要在服务器上得知每个客户端正在访问第几页,将要访问第几页,每页要显示多少数据,这些需要允分了解ASP.NET的状态机制。
首先我们来看看分页时在UI层要呈现哪些东西
1) 呈现当前页的数据,这是最重要的,这些数据我们根据当前是第几页,每页显示多少条数据来查询数据库。
2) 呈现导航链接。导航链接我们根据当前页,总页数来动态的显示链接。
3) 当前页状态信息。在UI层我们可以显示总页数,当前页是第几页。当然这不是必须的。
4) 表现层的事件。在表现层当我们点击导航链接的时候,如何在服务器端捕获客户端发生的事件和客户端当前的状态并作出正确的响应。
5) 在客户端呈现的时候,我们要在客户端保存几个有用的信息,
a. 当前用户在第几页
b. 要使服务器端能从用户点击导航链接时所要的数据,即下个状态跳转到第几页。
把各层联系起来就是,在客户端所发生的分页事件在服务器端的表现层捕获后调用业务层,业务层再调用数据访问层,数据访问层再调用数据层以获取数据,层间传递的数据结构可选择。
现在来看看ASP.NET 2.0几种常见的三层分页解决方案
1) GridView +ObjectDataSource
ASP.NET2.0提供了SqlDataSource数据源控件,支持用于指定连接字符串、SQL 语句或存储过程的属性,用以查询或修改数据库。但是,SqlDataSource 控件存在一个问题:该控件的缺点在于它迫使您将用户界面层与业务逻辑层混合在一起。然而随着应用程序规模的扩大,您会越来越感觉到混合多个层的做法是不可取的。 生成严格意义上的多层 Web 应用程序时,您应该具有清晰的用户界面层、业务逻辑层和数据访问层。仅仅由于 SqlDataSource 控件的强制而在用户界面层引用 SQL 语句或存储过程是不可取的。
ObjectDataSource 控件对象模型类似于 SqlDataSource 控件。ObjectDataSource 公开一个 TypeName 属性(而不是 ConnectionString 属性),该属性指定要实例化来执行数据操作的对象类型(类名)。类似于 SqlDataSource 的命令属性,ObjectDataSource 控件支持诸如 SelectMethod、UpdateMethod、InsertMethod 和 DeleteMethod 的属性,用于指定要调用来执行这些数据操作的关联类型的方法。ObjectDataSource可以通过TypeName 属性直接调用业务层的类。
ObjectDataSource对分页的支持,在ObjectDataSource调用的业务层类中对应SelectMethod的方法中要实现ObjectDataSource的两个参数MaximumRowsParameterName, StartRowIndexParameterName。还要实现ObjectDataSource中的SelectCountMethod方法,这是查询数据总数据,以便GridView进行分页,这样在GridView指定数据源为ObjectDataSource并允许分页,设置分页的网格就可以分页了,并且ObjectDataSource会自动的根据两个参数MaximumRows, StartRowIndex来呈现GridView当前页面所要的数据,当然我们在业务层,数据访问层,数据层都要对对应的SelectMethod方法实现参数MaximumRows,StartRowIndex
2) GridView + PageIndexChanged事件
GridView有个PageIndexChanged事件,我们在页面代码中增加处理PageIndexChanged事件的方法,然后根据GridView的PageIndex,PageSize属性调用业务层相应的分页方法然后绑定数据。
3) Repeater + URL字符串参数
GridView是固定了的格式显示数据,Repeater控件是一个数据显示控件,该控件允许通过为列表中显示的每一项重复使用指定的模板来自定义布局。但是Repeater没有内建的分页功能。没有内建的分页功能,我们就要辅助实现它,常见的解决方案有,用URL字符串参数传递信息,然后在服务端数据传递过来的信息,然后进行数据绑定。
4) 数据控件 + AspNetPager分页控件
分页原理基本上一样,而且UI元素也差不多,无非就是前一页,后一页,第一页,最后一页,还有中间的几页,我们可以把这些都抽象出来,然后写一个自定义控件分页控件,分页控件定义一些属性和事件,在要用到分页的页面直接调用这个控件就可以了,根据分页控件所发生的事件调用业务层数据并绑定数据控件。