您的位置:首页技术开发.Net 专栏 → [ASP.NET2.0]Repeater C# 不用存储过分页

[ASP.NET2.0]Repeater C# 不用存储过分页

时间:2009/11/10 12:06:00来源:本站整理作者:我要评论(0)

三层架构:

1、DAL:封装了SELECT * FROM table事务(1)。

2、BLL:用GetAll()方法封装了对DAL的事务(1)的访问,并返回一个List<Object>。

3、View:通过Repeater遍历出来。

其中:objPage.DataSource = ds.Tables[ " testTable " ].DefaultView;

修改为:objPage.DataSource = tableBLL.GetAll();


测试的结果表示,在Controller(*.aspx.cs)中按上一篇文中的方法定义,空间并不会自动帮你填充Limit条件(如TOP N等),而是不加修改的原封不动地调用你的封装好的方法,原封不动地执行(SELECT * FROM table)获取表的所有数据,就是说,Repeater只会对你返回的结果进行截断处理,就是从数据库中查询所有记录,抽取N条显示在表现层。毋庸置疑,这个效率是很低的。当数据海量时,可以想象这样一次查询的数据量传输占用了多少带宽,还有你的服务器内存。

当你看懂了《[ASP.NET2.0]Repeater C# 分页用法》,其实对这个进行简单的优化也就不难了。只要把GetAll()修改为GetAll(int From , int To),相应改变里面的逻辑便可。具体的分页逻辑,建议用一个PageUtil的辅助类单独封装起来。

关于SQL 2005分页查询,从网上截取到一下内容,请参考 :

http://www.blogjava.net/mlh123caoer/archive/2006/06/10/51819.html

Microsoft SQL Server 2005 查询分页

微软新的SQL Server 2005新增了数据库分页功能,以后再也用写复杂不灵活而低效率的分页存储过程。
新的数据库分页功能的核心是一个叫row_number的函数
具体如下:

返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

语法

ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] <order_by_clause> )

备注
ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

参数
<partition_by_clause>

将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。

<order_by_clause>

确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。

有关详细信息,请参阅 OVER 子句 (Transact-SQL)。

返回类型
bigint

示例
以下示例将根据年初至今的销售额,返回 AdventureWorks 中销售人员的 ROW_NUMBER。

复制代码
USE AdventureWorks
GO
SELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0

以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序。

复制代码
USE AdventureWorks;
GO
WITH OrderedOrders AS
(SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (order by OrderDate)as RowNumber
FROM Sales.SalesOrderHeader )
SELECT *
FROM OrderedOrders
WHERE RowNumber between 50 and 60;

==============================
进过我对百万行数据记录的分页测试,效率比以前网上能够找到的最好的存储过程(个人意见)稍高。
但是还是比同样的Oralce的分页效率低。

最后我总结一下,如果想查找按ID排的10~20行的记录,可以这么写:

SELECT *
FROM

(

SELECT ROW_NUMBER() OVER (order by ID) AS rowNum, *
FROM table

)

AS a
WHERE a.rowNum>= 10 AND
 

相关视频

    没有数据

相关阅读 ie6下面asp.net mvc3 部署应用程序在asp.net mvc中实现右键菜单和简单的分页教程ASP.NET中MVC框架模式方法如何实现分享ASP.NET 2.0 中保护机密数据ASP.NET配置文件Web.configASP.NET 2.0 AJAX中Webservice调用方法ASP.NET 的安全认证实现ASP.NET生成随机密码功能

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 什么是.NET中的TDD?ASP.NET AJAX入门简介 WebMatrix入门教程VC++2008中如何调用GetOpenFileName打开文件PlaySound函数在VC++6.0中如何播放音乐及声请问VC++回调函数怎么用

人气排行 嵌入式实时操作系统VxWorks入门教程ArrayList 与 string、string[] 的转换C#遍历整个文件夹及子目录的文件代码WebMatrix入门教程asp.net判断文件或文件夹是否存在c#判断数据NULL值的方法vc++6.0怎么写Windows简单窗口代码.net解决数据导出excel时的格式问题