2009-05-12 4 views
1

J'ai un GridView qui accède aux données d'un SqlDataSource en mode DataSet. J'ai la pagination activée et cela fonctionne, mais sur de grands ensembles de données, il faut un temps extraordinairement long pour extraire des données.Paging dans GridView en utilisant SqlDataSource

Il semble que le SqlDatSource tire toutes les données, puis il est paginé au niveau de l'interface utilisateur. C'est évidemment une solution minable. J'ai regardé Tips on speeding up a SqlDataSource? et il semble être sur le même sujet - il semble que je devrais implémenter un code de pagination dans mon instruction SELECT, je ne suis pas sûr de savoir comment faire cela. Je ne suis pas opposé à l'insérer dans un SProc si je le dois, mais laisser la commande SELECT dans le SqlDataSource serait mieux.

Je sais que MySQL a LIMIT X, Y (où X est le nombre de lignes à récupérer et Y est décalé). TOP ne semble pas faire la même chose, et je ne sais pas comment obtenir les informations de pagination de GridView dans le SqlDataSource non plus.

Est-ce la meilleure façon de procéder? (Et si oui, où dois-je commencer?) Ou y at-il un meilleur moyen d'obtenir une pagination efficace à partir d'un SqlDataSource dans un GridView?

(j'utilise C# si elle compte, mais je ne pense pas qu'il devrait.)

Merci.

Répondre

1

ROW_NUMBER() est votre ami, utiliser comme dans cet exemple:

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 

ont l'application garder une trace de ce qui est montrant sur une page. Si vous voulez afficher 10 lignes sur une page, renvoyez 1-11, affichez 1-10, si rowcount == 11 affiche le lien "suivant".

+0

+ 1 pour la bonne direction, la plus grande question serait de savoir comment créer un wrapper dynamique pour fournir un paging générique. –