当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  用ObjectDataSource实现自定义分页的心得总结

 用ObjectDataSource实现自定义分页的心得总结

点击次数:35 次 发布日期:2008-11-26 11:18:36 作者:源代码网
源代码网推荐      在Web应用开发中列表的分页是难免要遇到的问题,在ASP.NET 2.0中微软为我们提供了很多数据源控件,如SqlDataSource、ObjectDataSource等,它们都可以实现默认分页,但是默认分页是在内存中实现的,用户量增大时Web服务器的负担会急剧增大,在多层体系结构程序开发中,往往把分页和排序的工作交给数据库服务器来完成,在网上也能找到很多能够快速实现分页的控件,但是做为一个程序员对分页的实现还是有一定的了解比较好,如果过渡的依赖于控件,你说写出的代码独立性就很差,一般在多层 web应用开发中建议尽量使用ObjectDataSource,而不要使用SqlDataSource,因为ObjectDataSource有一下有点:
源代码网推荐  1、SqlDataSource是针对Sql Server的,对其他的数据库支持不够,例如在访问Oracle数据库时,要用存储过程返回结构集合SqlDataSource显得无能为力。
源代码网推荐  2、 ObjectDataSource 提供一个 TypeName 属性(而不是 ConnectionString属性),该属性指定用于执行数据操作的业务逻辑类的类名,ObjectDataSource可以通过TypeName 属性直接调用业务层的类,在多层应用中ObjectDataSource 显得很实用,而SqlDataSource要在页面上指定ConnectionString、Command,系统的层次结构被搞乱,不便于系统的维护工作。
源代码网推荐  3、ObjectDataSource 控件提供了EnablePaging属性、SelectCountMethod属性、StartRowIndexParameterName属性和 MaximumRowsParameterName属性专门支持数据源分页。 SelectCountMethod属性指定的是获取数据项总数的方法。StartRowIndexParameterName属性用于指定一个参数的名称,如程序中不特别设定,其默认参数名为startRowIndex,该参数代表该页数据项的开始行索引; MaximumRowsParameterName属性也用于指定一个参数名称,其默认参数名为maximumRows,该参数代表一页中容纳的数据项总数。SqlDataSource完全没有提供这些功能。
源代码网推荐  4、SqlDataSource只支持内存分页,而不支持数据库分页, ObjectDataSource 两者都支持,内存分页每次都检索出所有数据并将其绑定到数据绑定控件中,虽然该控件只能一页一页显示这些数据,但是所有数据其实都已经被绑定到控件上了。而数据库分页的含义是显示到哪一页就检索并绑定哪一页的数据。显然在大数据量的情况下,数据库分页的效率会高很多。
源代码网推荐  关于分页方法
源代码网推荐   很多人写分页的方法喜欢创建临时表,虽然这是一个快捷的实现方法,但这样做效率肯定很低,其实在SQL Server和Oracle中分别使用Top和ROWNUM可以很方便的使用排序,充分利用数据库服务器来做计算可以降低web服务的负担。
源代码网推荐  
源代码网推荐  SQL Server的分页代码:
源代码网推荐  SelectByPage
源代码网推荐   1SET QUOTED_IDENTIFIER ON
源代码网推荐   2GO
源代码网推荐   3SET ANSI_NULLS ON
源代码网推荐   4GO
源代码网推荐   5
源代码网推荐   6
源代码网推荐   7
源代码网推荐   8ALTER proc SelectByPage(@startRowIndex int,@maximumRows int,@SortBy varchar(50))
源代码网推荐   9as
源代码网推荐  10declare @TotalCnt int
源代码网推荐  11declare @sql varchar(8000)
源代码网推荐  12begin
源代码网推荐  13select @TotalCnt = count(*) from sys_user
源代码网推荐  14
源代码网推荐  15set @sql = "select top " + convert(varchar(20),@maximumRows) + " * from "
源代码网推荐  16set @sql = @sql + "("
源代码网推荐  17set @sql = @sql + " select top " + convert(varchar(20),(@TotalCnt-@startRowIndex)) + " * from sys_user a "
源代码网推荐  18set @sql = @sql + " order by a." + @SortBy + " desc "
源代码网推荐  19set @sql = @sql + ") b"
源代码网推荐  20set @sql = @sql + " order by b." + @SortBy
源代码网推荐  21exec(@sql)
源代码网推荐  22--print @sql
源代码网推荐  23end
源代码网推荐  24
源代码网推荐  25
源代码网推荐  26
源代码网推荐  27GO
源代码网推荐  28SET QUOTED_IDENTIFIER OFF
源代码网推荐  29GO
源代码网推荐  30SET ANSI_NULLS ON
源代码网推荐  31GO
源代码网推荐  32
源代码网推荐  33
源代码网推荐  
源代码网推荐  Oracle中的分页方法:
源代码网推荐  select_by_page
源代码网推荐   1/**//* Formatted on 2007/04/16 11:16 (Formatter Plus v4.8.8) */
源代码网推荐   2CREATE OR REPLACE PROCEDURE diswebuser.select_by_page (
源代码网推荐   3 p_start_page NUMBER,
源代码网推荐   4 p_page_size NUMBER,
源代码网推荐   5 p_sort_by VARCHAR2
源代码网推荐   6)
源代码网推荐   7AS
源代码网推荐   8 v_cnt INTEGER;
源代码网推荐   9 v_sql VARCHAR2 (4000);
源代码网推荐  10 v_start_index INTEGER;
源代码网推荐  11 v_end_index INTEGER;
源代码网推荐  12BEGIN
源代码网推荐  13 SELECT COUNT (*)
源代码网推荐  14 INTO v_cnt
源代码网推荐  15 FROM side_slope;
源代码网推荐  16
源代码网推荐  17 --v_start_index := (p_start_page - 1) * p_page_size + 1;
源代码网推荐  18 v_start_index := p_start_page + 1;
源代码网推荐  19 v_end_index := p_start_page + p_page_size;
源代码网推荐  20 v_sql := v_sql || "SELECT * ";
源代码网推荐  21 v_sql := v_sql || " FROM (SELECT ROWNUM AS row_id, a.* ";
源代码网推荐  22 v_sql := v_sql || " FROM side_slope a ";
源代码网推荐  23 v_sql := v_sql || " ORDER BY side_slope_id) ";
源代码网推荐  24 v_sql :=
源代码网推荐  25 v_sql
源代码网推荐  26 || " WHERE row_id BETWEEN "
源代码网推荐  27 || TO_CHAR (v_start_index)
源代码网推荐  28 || " AND "
源代码网推荐  29 || TO_CHAR (v_end_index)
源代码网推荐  30 || " ";
源代码网推荐  31 v_sql := v_sql || "ORDER BY side_slope_id ";
源代码网推荐  32 DBMS_OUTPUT.put_line (v_sql);
源代码网推荐  33END;
源代码网推荐  34/
源代码网推荐  
源代码网推荐  当然在Oracle存储中返回结构集要使用ref cursor,使用Oracle的朋友一定很清楚,我在这里就不罗嗦了,那样写还得创建包,麻烦^_^,上面只是打印出了sql语句。
源代码网推荐  还望高手指点  做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华