65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 SQL Server 2005 在任何 ASP.NET 网格中进行分页

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (7投票s)

2010年7月7日

CPOL

3分钟阅读

viewsIcon

37409

在任何 ASP.NET 网格中使用 SQL Server 2005 实现分页。

引言

本文档旨在帮助您为任何 ASP.NET/WinForms 网格添加分页功能。使用此方法的优点在于它不会一次性获取所有数据,而是仅从数据库中获取所需的数据,从而在数据量很大时显著提高页面性能。

背景

在 ASP.NET 提供的各种网格控件上工作了五年多,并使用 Microsoft 的技术将所有数据填充到数据集,然后将其绑定到网格控件,我一直认为应该有更好的方法来执行此操作,因为绑定到控件的数据量巨大。

Using the Code

在使用 Microsoft 默认技术时,我的主要目标是在网格上显示少量记录并允许分页。为此,我通常会从数据库中获取所有数据,认为即使我获取了所有数据,也只需要执行一次,因此分页会变得更容易和更有效。

但是,有一天现实(这种方法的缺点)让我意识到,当我的应用程序几乎有一百万条记录时,网格页面的加载速度变得非常慢。现在我必须寻找一种更好的方法(我一直思考的方法 ;-)),它允许我仅从数据库中获取用于显示的所需行。然后,SQL 的“ROW_NUMBER()”函数帮助了我,通过在存储过程中使用此函数,我的页面性能得到了显著提高(我找不到更好的词来形容)。更新后的存储过程如下所示。

CREATE PROCEDURE [dbo].[GetEmployeesPage] 
( 
@RowFrom int, 
@RowTo int 
) 
AS 
BEGIN 
SET NOCOUNT ON; 
WITH IndexedEmployees AS 
( 
SELECT 
ROW_NUMBER() OVER (ORDER BY Id) AS rowIndex, 
Employees.* 
FROM 
Employees 
) 

SELECT * FROM IndexedEmployees WHERE rowIndex BETWEEN @RowFrom AND @RowTo 

SELECT COUNT(*) 
FROM 
Employees 

END 
GO

存储过程返回两个结果。第一个包含基于 RowFromRowTo 参数进行分页的数据,第二个查询返回员工数量,这些可以用于网页以确定分页参数。

例如:如果“Employees”表包含 54 行,则基于不同的分页参数,这将是 1-10、11-20、21-30、31-40、41-50、51-54。第二个结果集允许开发人员发送 51-54 参数。

关注点

SQL Server 2005 的“ROW_NUMBER()”函数是新的,用于为查询结果分配排名。此排名可用于记录的分页。

我使用传统方法和这种方法进行的一项分析将引起许多人的兴趣。我使用三种方法从包含五十万条记录的表中获取数据。

  • SqlDataAdapter.Fill() 方法需要 42 秒才能获取所有数据。
  • SqlDataAdapter.Fill() 方法,使用起始记录和页面大小,大约需要 10 秒才能获取分页数据。

而使用上述方法,可以以 1 秒的几分之一的时间获取相同的数据。

此技术可以扩展到网格视图添加排序功能。

© . All rights reserved.