KiMoGiGi 技术文集
不在乎选择什么,而在乎坚持多久……
IT博客
首页
联系
聚合
管理
185 Posts :: 14 Stories :: 48 Comments :: 0 Trackbacks
公告
KiMoGiGi 技术文集
注:本Blog技术文章
除特别说明外
全部均来源Web和转载
最近正在看的
(图片来源
China-Pub
):
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(10)
给我留言
查看公开留言
查看私人留言
随笔分类
(219)
AJAX.NET(5)
ASP.NET(38)
Basic(7)
C# / Winforms(64)
Enterprise Library(3)
Java(1)
JavaScript(35)
Python(4)
Web小技巧(19)
WPF/SilverLight(4)
工具插件(6)
数据库相关(7)
经验之谈(24)
网络编程(2)
随笔档案
(185)
2011年3月 (1)
2010年11月 (1)
2010年8月 (1)
2010年6月 (2)
2009年10月 (1)
2009年9月 (9)
2009年7月 (1)
2009年5月 (2)
2009年3月 (6)
2009年2月 (3)
2009年1月 (7)
2008年12月 (6)
2008年11月 (5)
2008年10月 (3)
2008年9月 (1)
2008年8月 (5)
2008年7月 (10)
2008年6月 (9)
2008年5月 (6)
2008年4月 (5)
2008年3月 (6)
2008年2月 (1)
2008年1月 (4)
2007年12月 (11)
2007年11月 (11)
2007年10月 (2)
2007年8月 (1)
2007年4月 (4)
2007年3月 (11)
2007年2月 (3)
2007年1月 (10)
2006年12月 (12)
2006年11月 (6)
2006年10月 (3)
2006年8月 (3)
2006年7月 (5)
2006年6月 (8)
文章分类
(25)
ASP.NET(8)
Basic Knowledge(1)
C#(4)
JavaScript
Web设计
开源框架 - NHibernate
数据库相关
经验之谈
英文文章翻译(12)
文章档案
(14)
2008年8月 (1)
2008年6月 (2)
2007年12月 (4)
2007年11月 (7)
收藏夹
JavaScript
Friend 's Blog
My Step
映画记录
技术崇拜
A JavaScript Fancier
Dflying
dudu
First we try, then we trust
lifesinger
淘宝网UED部-Web前端
TerryLee's Tech Space
听棠.NET
周爱民
职业生涯顾问Leo的专栏
鸟食轩
技術網站
C# Corner
codeplex
CSDN
博客園
数据结构
點部落
搜索
用ObjectDataSource实现自定义分页的心得总结
From
漂泊雪狼的博客
在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
1
SET
QUOTED_IDENTIFIER
ON
2
GO
3
SET
ANSI_NULLS
ON
4
GO
5
6
7
8
ALTER
proc
SelectByPage(
@startRowIndex
int
,
@maximumRows
int
,
@SortBy
varchar
(
50
))
9
as
10
declare
@TotalCnt
int
11
declare
@sql
varchar
(
8000
)
12
begin
13
select
@TotalCnt
=
count
(
*
)
from
sys_user
14
15
set
@sql
=
'
select top
'
+
convert
(
varchar
(
20
),
@maximumRows
)
+
'
* from
'
16
set
@sql
=
@sql
+
'
(
'
17
set
@sql
=
@sql
+
'
select top
'
+
convert
(
varchar
(
20
),(
@TotalCnt
-
@startRowIndex
))
+
'
* from sys_user a
'
18
set
@sql
=
@sql
+
'
order by a.
'
+
@SortBy
+
'
desc
'
19
set
@sql
=
@sql
+
'
) b
'
20
set
@sql
=
@sql
+
'
order by b.
'
+
@SortBy
21
exec
(
@sql
)
22
--
print @sql
23
end
24
25
26
27
GO
28
SET
QUOTED_IDENTIFIER
OFF
29
GO
30
SET
ANSI_NULLS
ON
31
GO
32
33
Oracle中的分页方法:
select_by_page
1
/**/
/*
Formatted on 2007/04/16 11:16 (Formatter Plus v4.8.8)
*/
2
CREATE
OR
REPLACE
PROCEDURE
diswebuser.select_by_page (
3
p_start_page
NUMBER
,
4
p_page_size
NUMBER
,
5
p_sort_by
VARCHAR2
6
)
7
AS
8
v_cnt
INTEGER
;
9
v_sql
VARCHAR2
(
4000
);
10
v_start_index
INTEGER
;
11
v_end_index
INTEGER
;
12
BEGIN
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);
33
END
;
34
/
当然在Oracle存储中返回结构集要使用ref cursor,使用Oracle的朋友一定很清楚,我在这里就不罗嗦了,那样写还得创建包,麻烦^_^,上面只是打印出了sql语句。
posted on 2007-04-18 01:15
KiMoGiGi
阅读(339)
评论(0)
编辑
收藏
引用
所属分类:
C# / Winforms
只有注册用户
登录
后才能发表评论。
Powered by:
IT博客
Copyright © KiMoGiGi