惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
罗磊的独立博客
IT之家
IT之家
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
博客园 - Franky
博客园 - 聂微东
博客园_首页
爱范儿
爱范儿
量子位
博客园 - 三生石上(FineUI控件)
G
Google Developers Blog
Martin Fowler
Martin Fowler
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Y
Y Combinator Blog
Vercel News
Vercel News
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
Engineering at Meta
Engineering at Meta

博客园 - 尹合磊

如何:在 Calendar 控件中显示数据库中的选定日期 AddNew 方法创建可更新 Recordset 对象的新记录。 求一“从所有同类中排除某一类型”正则表达式? 按字节长度截取字符串(支持截取带HTML代码样式的字符串) ASP.NET2.0资料收藏 asp中通过一个全局方法来防止SQL注入式攻击 在一个JS文件中包含中文字符串,通过innerHTML输出后中文乱码? 解决TreeView中使用JavaScript完成CheckBox全选的办法 Yahoo邮箱POP、SMTP服务器设置详解 关于前台调用后台事件__doPostBack函数 客户端触发Asp.net中服务端控件事件 marquee基本语法的全解释 SHTML 教程 SQL:以指定的次数重复字符表达式 JavaScript不间断连续图片滚动效果 Asp.net(C#)给图片加上水印效果 ASP.NET(C#)生成缩略图 ASP.NET中存取图片到数据库的示例 Data Access Application Block--使用存储过程,参数及事务
用ObjectDataSource实现自定义分页的心得总结
尹合磊 · 2008-08-17 · via 博客园 - 尹合磊

在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的分页代码:

复制  保存

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

ALTER    proc SelectByPage(@startRowIndex int,@maximumRows int,@SortBy varchar(50))
as
declare @TotalCnt int
declare @sql varchar(8000)
begin
select @TotalCnt = count(*) from sys_user
set @sql = 'select top ' + convert(varchar(20),@maximumRows) + ' * from '
set @sql = @sql + '('
set @sql = @sql + '  select top ' + convert(varchar(20),(@TotalCnt-@startRowIndex)) + ' * from sys_user a '
set @sql = @sql + '  order by a.' + @SortBy + ' desc '
set @sql = @sql + ') b'
set @sql = @sql + ' order by b.' + @SortBy
exec(@sql)
--print @sql
end

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

Oracle中的分页方法:

复制  保存

/* Formatted on 2007/04/16 11:16 (Formatter Plus v4.8.8) */
CREATE OR REPLACE PROCEDURE diswebuser.select_by_page (
   p_start_page   NUMBER,
   p_page_size    NUMBER,
   p_sort_by      VARCHAR2
)
AS
   v_cnt           INTEGER;
   v_sql           VARCHAR2 (4000);
   v_start_index   INTEGER;
   v_end_index     INTEGER;
BEGIN
   SELECT COUNT (*)
     INTO v_cnt
     FROM side_slope;

   --v_start_index := (p_start_page - 1) * p_page_size + 1;
   v_start_index := p_start_page + 1;
   v_end_index := p_start_page + p_page_size;
   v_sql := v_sql || 'SELECT   * ';
   v_sql := v_sql || '    FROM (SELECT   ROWNUM AS row_id, a.* ';
   v_sql := v_sql || '              FROM side_slope a ';
   v_sql := v_sql || '          ORDER BY side_slope_id) ';
   v_sql :=
         v_sql
      || '   WHERE row_id BETWEEN '
      || TO_CHAR (v_start_index)
      || ' AND '
      || TO_CHAR (v_end_index)
      || '  ';
   v_sql := v_sql || 'ORDER BY side_slope_id ';
   DBMS_OUTPUT.put_line (v_sql);
END;
/

当然在Oracle存储中返回结构集要使用ref cursor,使用Oracle的朋友一定很清楚,我在这里就不罗嗦了,那样写还得创建包,麻烦^_^,上面只是打印出了sql语句。
还望高手指点