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






4.43/5 (7投票s)
在任何 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
存储过程返回两个结果。第一个包含基于 RowFrom
和 RowTo
参数进行分页的数据,第二个查询返回员工数量,这些可以用于网页以确定分页参数。
例如:如果“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 秒的几分之一的时间获取相同的数据。
此技术可以扩展到网格视图添加排序功能。