2009-05-12 2 views
1

Ich habe eine GridView, die Daten im DataSet-Modus von einer SqlDataSource zugreift. Ich habe Paging aktiviert und es funktioniert, aber in großen Datasets dauert es außerordentlich lange, um Daten zu ziehen.Paging in GridView mit SqlDataSource

Es scheint, als würde die SqlDatSource alle Daten abrufen, und dann wird sie auf UI-Ebene paginged. Dies ist offensichtlich eine miese Lösung. Ich habe mir Tips on speeding up a SqlDataSource? angeschaut und es scheint, als wäre ich mit demselben Thema beschäftigt - es sieht so aus, als müsste ich etwas Paging-Code in meine SELECT-Anweisung implementieren, ich bin mir einfach nicht sicher, wie ich das machen soll. Ich bin nicht dagegen, es in einen SProc zu ziehen, wenn es sein muss, aber es wäre besser, den SELECT-Befehl in der SqlDataSource zu belassen.

Ich weiß, MySQL hat LIMIT X, Y (X ist die Anzahl der Zeilen abzurufen und Y ist Offset). TOP scheint nicht das gleiche zu tun, und ich weiß auch nicht, wie ich die Paging-Informationen von der GridView in die SqlDataSource bringen soll.

Ist das der beste Weg, dies zu tun? (Und wenn ja, wo fange ich an?) Oder gibt es einen besseren Weg, effektives Paging von einer SqlDataSource in einer GridView zu bekommen?

(Ich bin mit C# wenn es darauf ankommt, aber ich glaube nicht, es sollte.)

Dank.

Antwort

1

ROW_NUMBER() ist dein Freund, verwenden wie in diesem Beispiel:

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 

haben die Anwendung verfolgen, was auf einer Seite angezeigt wird. Wenn Sie auf einer Seite 1-10 Zeilen anzeigen möchten, zeigen Sie 1-10 an, wenn rowcount == 11 "nächste" Verknüpfung anzeigen.

+0

+1 für die richtige Richtung, wäre die größere Frage, wie man einen dynamischen Wrapper für generische Paging erstellen. –