使用SqlDataSource在GridView中进行分页

时间:2009-05-12 18:53:33

标签: .net sql-server pagination

我有一个GridView,可以在DataSet模式下访问SqlDataSource中的数据。我启用了分页功能,但是在大型数据集上,拉取数据需要非常长的时间。

似乎SqlDatSource正在提取所有数据,然后在UI级别进行分页。这显然是一个糟糕的解决方案。我看了Tips on speeding up a SqlDataSource?,似乎是在同一个主题上 - 看起来我需要在SELECT语句中实现一些分页代码,我只是不知道该怎么做。如果必须的话,我不反对把它拉进SProc,但是在SqlDataSource中保留SELECT命令会更好。

我知道MySQL有LIMIT X,Y(其中X是要检索的行数,Y是偏移的)。 TOP似乎没有做同样的事情,我不知道如何从GridView获取分页信息到SqlDataSource。

这是最好的方法吗? (如果是这样,我从哪里开始?)或者是否有更好的方法从GridView中的SqlDataSource获得有效的分页?

(如果重要的话,我正在使用C#,但我认为不应该。)

感谢。

1 个答案:

答案 0 :(得分:1)

ROW_NUMBER()是您的朋友,请在此示例中使用:

DECLARE @test TABLE (LastName varchar(25),FirstName varchar(25))
INSERT INTO @test values ('Jones','Billy')
INSERT INTO @test values ('Jones','Suzie')
INSERT INTO @test values ('Jones','Beth')
INSERT INTO @test values ('Jones','Ron')
INSERT INTO @test values ('Jones','Dan')
INSERT INTO @test values ('Smith','Abby')
INSERT INTO @test values ('Smith','Debbie')
INSERT INTO @test values ('Smith','Joe')
INSERT INTO @test values ('Smith','Dan')
INSERT INTO @test values ('Brown','Matt')
INSERT INTO @test values ('Brown','Rob')

;WITH TestRank AS
(
    select
        LastName,FirstName, row_number() over(order by LastName,FirstName) AS RowNumber
        from @test
)
SELECT
    LastName,FirstName
    FROM TestRank
    WHERE RowNumber>=3 AND RowNumber<=5
    ORDER BY RowNumber

让应用程序跟踪页面上显示的内容。如果要在页面上显示10行,请返回1-11,显示1-10,如果rowcount == 11则显示“next”链接。