Blättern in einem Abfrageergebnis

Gilt für: .NET Framework .NET .NET Standard

Herunterladen von ADO.NET

Das Paginieren eines Abfrageergebnisses ist der Vorgang, bei dem die Ergebnisse einer Abfrage in kleineren Teilmengen von Daten, sogenannten Seiten, zurückgegeben werden. Dies ist eine allgemein übliche Vorgehensweise, um einem Benutzer Ergebnisse in kleinen Blöcken anzuzeigen, die sich leicht verwalten lassen.

Die SqlDataAdapter-Klasse stellt eine Funktion bereit, mit der durch Überladungen der Fill-Methode nur eine Seite mit Daten zurückgegeben wird. Dies ist jedoch möglicherweise nicht die beste Wahl zum Paginieren großer Abfrageergebnisse, da trotz der Tatsache, dass der DataAdapter das Ziel DataTable oder DataSet nur mit den angeforderten Datensätzen füllt, weiterhin die Ressourcen für die Rückgabe des gesamten Abfrageergebnisses verwendet werden.

Geben Sie zusätzliche Kriterien für Ihre Abfrage ein, um eine Seite mit Daten von einer Datenquelle ohne die Ressourcen zurückzugeben, die zum Zurückgeben der gesamten Abfrage erforderlich sind, sodass nur die erforderlichen Zeilen zurückgegeben werden.

Wenn Sie die Fill-Methode zum Zurückgeben einer Seite mit Daten verwenden möchten, legen Sie für den ersten Datensatz auf der Datenseite einen startRecord-Parameter fest und für die Anzahl von Datensätzen auf der Datenseite einen maxRecords-Parameter.

Beispiel

Im folgenden Codebeispiel wird gezeigt, wie mit der Fill-Methode die erste Seite mit fünf Datensätzen eines Abfrageergebnisses zurückgegeben wird.

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");

Im vorherigen Beispiel wird die DataSet-Klasse nur mit fünf Datensätzen gefüllt, aber die gesamte Orders-Tabelle zurückgegeben. Verwenden Sie die Klauseln und TOP in Ihrer SQL-Anweisung wie im folgenden Codebeispiel gezeigt, um die WHERE-Klasse mit diesen fünf Datensätzen zu füllen, aber nur fünf Datensätze zurückzugeben.

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");

Hinweis

Wenn Sie die Abfrageergebnisse auf diese Weise seitenweise durchgehen, müssen Sie das beibehalten, das die Zeilen sortiert, damit die eindeutige ID an den Befehl übergeben werden kann, der die nächste Seite mit Datensätzen zurückgibt, wie im folgenden Codebeispiel gezeigt.

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

Um den next page of records mithilfe der Überladung der Methode Fill zurückzugeben, die die Parameter startRecord und maxRecords verwendet, erhöhen Sie den aktuellen Datensatzindex um die Seitengröße, und füllen Sie die Tabelle.

Hinweis

Denken Sie daran, dass der Datenbankserver alle Abfrageergebnisse zurückgibt, auch wenn nur eine Seite mit Datensätzen zur DataSet-Klasse hinzugefügt wird.

Im folgenden Codebeispiel wird der Inhalt der Tabellenzeilen gelöscht, bevor sie mit der nächsten Seite mit Daten gefüllt werden. Sie sollten eventuell eine bestimmte Anzahl abgerufener Zeilen in einem lokalen Cache speichern, um die Anzahl der Zugriffe auf den Datenbankserver zu reduzieren.

currentIndex += pageSize;

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

Geben Sie restriktive Kriterien für die SQL-Anweisung SELECT an, um die nächste Seite mit Datensätzen zurückzugeben, ohne dass der Datenbankserver die gesamte Abfrage zurückgeben muss. Da im vorhergehenden Beispiel der zuletzt zurückgegebene Datensatz beibehalten wurde, können Sie ihn in der WHERE-Klausel verwenden, um – wie im folgenden Codebeispiel gezeigt – einen Ausgangspunkt für die Abfrage anzugeben.

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");