论坛
门户
内部优惠
喜欢
话题
VIP会员
搜索
新浪微博
登录
注册
100%
100%
首页
>
网页设计
>
net技术
>
用objectdatasource实现自定义分页的心得总结_...
回复
« 返回列表
111111
精灵王
注册日期
2010-12-08
发帖数
640
QQ
火币
1103枚
粉丝
120
关注
75
加关注
写私信
打招呼
阅读:
3403
回复:
0
用objectdatasource实现自定义分页的心得总结_asp.net技巧
楼主
#
更多
只看楼主
倒序阅读
发布于:2010-12-15 21:08
保存
100%
100%
[]
1
在
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
4g
O
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语句。
还望高手指点
喜欢
0
评分
0
最新喜欢:
回复
100%
发帖
回复
« 返回列表
普通帖
您需要登录后才可以回帖,
登录
或者
注册
100%
返回顶部
关闭
最新喜欢