Partager via


Pagination sur un résultat de requête

S'applique à : .NET Framework .NET .NET Standard

Télécharger ADO.NET

Ce mode d'affichage consiste à retourner les résultats d'une requête sous forme de sous-ensembles, plus petits, de données, aussi appelés pages. Cette façon de procéder est courante lorsqu'il s'agit de présenter à l'utilisateur un affichage des résultats par petits segments, plus faciles à gérer.

Le SqlDataAdapter propose une fonctionnalité permettant de retourner uniquement une page de données, via des surcharges de la méthode Fill. Cependant, cette solution n’est pas le meilleur choix quand les résultats de la requête sont très volumineux car, si le DataAdapter remplit l’objet DataTable ou DataSet cible uniquement avec les enregistrements demandés, les ressources sollicitées restent les mêmes que pour retourner l’intégralité de la requête.

Pour retourner une page de données provenant d'une source de donnée sans solliciter les ressources requises pour retourner l'intégralité de la requête, spécifiez des critères supplémentaires pour votre requête afin de limiter le nombre de lignes retournées à celles qui sont requises.

Pour utiliser la méthode Fill afin de retourner une page de données, spécifiez un paramètre startRecord pour le premier enregistrement de la page de données et un paramètre maxRecords indiquant le nombre d’enregistrements de la page de données.

Exemple

L’exemple de code suivant montre comment utiliser la méthode Fill pour retourner la première page des résultats d’une requête, sachant que la page compte cinq enregistrements.

int currentIndex = 0;
int pageSize = 5;

string orderSQL = "SELECT * FROM Orders ORDER BY OrderID";
// Assumes that connection is a valid SqlConnection object.  
SqlDataAdapter adapter = new SqlDataAdapter(orderSQL, connection);

DataSet dataSet = new DataSet();
adapter.Fill(dataSet, currentIndex, pageSize, "Orders");

Dans l’exemple précédent, le DataSet ne contient que cinq enregistrements, mais la table Orders est retournée dans son intégralité. Pour remplir le DataSet avec ces cinq mêmes enregistrements, mais en ne retournant que cinq enregistrements, utilisez les clauses TOP et WHERE dans votre instruction SQL, comme dans l’exemple de code suivant.

int pageSize = 5;

string orderSQL = "SELECT TOP " + pageSize +
  " * FROM Orders ORDER BY OrderID";

// Assumes that connection is a valid SqlConnection object.  
SqlDataAdapter adapter = new SqlDataAdapter(orderSQL, connection);

DataSet dataSet = new DataSet();
adapter.Fill(dataSet, "Orders");

Notes

Quand la pagination des résultats de la requête est effectuée de cette façon, vous devez conserver le unique identifier qui classe les lignes, afin de passer l’ID unique à la commande pour retourner la page d’enregistrements suivante, comme illustré dans l’exemple de code suivant.

string lastRecord = 
    dataSet.Tables["Orders"].Rows[pageSize - 1]["OrderID"].ToString();

Pour retourner la page next page of records en utilisant la surcharge de la méthode Fill qui prend les paramètres startRecord et maxRecords, incrémentez l’index de l’enregistrement actif en fonction de la taille de la page et remplissez la table.

Notes

Rappelez-vous que le serveur de base de données retourne l’intégralité des résultats de la requête, même si une seule page d’enregistrements est ajoutée au DataSet.

Dans l'exemple de code suivant, les lignes de la table sont vidées de leur contenu avant de recevoir la page de données suivante. Vous avez la possibilité de conserver dans un cache local un certain nombre de lignes retournées afin de limiter les sollicitations du serveur de base de données.

currentIndex += pageSize;

// Assumes that dataset and adapter are valid objects.
dataSet.Tables["Orders"].Rows.Clear();
adapter.Fill(dataSet, currentIndex, pageSize, "Orders");

Pour retourner la page d'enregistrements suivante sans que le serveur de base de données ne retourne l'intégralité de la requête, spécifiez des critères restrictifs pour l'instruction SELECT. Parce que l'exemple précédent conservait le dernier enregistrement retourné, vous pouvez l'utiliser dans la clause WHERE afin de spécifier le point de départ de la requête, comme le montre l'exemple de code suivant.

orderSQL = "SELECT TOP " + pageSize + 
    " * FROM Orders WHERE OrderID > " + lastRecord + " ORDER BY OrderID";
adapter.SelectCommand.CommandText = orderSQL;

dataSet.Tables["Orders"].Rows.Clear();

adapter.Fill(dataSet, "Orders");

Voir aussi