Teilen über


Durchblättern eines Abfrageergebnisses

Beim Paging durch ein Abfrageergebnis werden die Ergebnisse einer Abfrage in kleineren Untergruppen von Daten oder Seiten zurückgegeben. Dies ist eine allgemein übliche Vorgehensweise, um einem Benutzer Ergebnisse in kleinen Blöcken anzuzeigen, die sich leicht verwalten lassen.

Das DataAdapter stellt eine Möglichkeit zur Verfügung, nur eine Seite mit Daten über Überladungen der Fill Methode zurückzugeben. Dies ist jedoch möglicherweise nicht die beste Wahl für das Durchblättern großer Abfrageergebnisse, da die Ressourcen weiterhin verwendet werden, um die gesamte Abfrage auszuführen, obwohl das DataAdapter-ZielDataTable oder DataSet nur mit den angeforderten Datensätzen gefüllt wird. 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.

Um die Fill Methode zum Zurückgeben einer Datenseite zu verwenden, geben Sie einen startRecord Parameter für den ersten Datensatz auf der Datenseite und einen maxRecords Parameter für die Anzahl der Datensätze auf der Datenseite an.

Das folgende Codebeispiel zeigt, wie Fill die Methode verwendet wird, um die erste Seite eines Abfrageergebnisses zurückzugeben, wobei die Seitengröße fünf Datensätze ist.

Dim currentIndex As Integer = 0
Dim pageSize As Integer = 5

Dim orderSQL As String = "SELECT * FROM dbo.Orders ORDER BY OrderID"
' Assumes that connection is a valid SqlConnection object.
Dim adapter As SqlDataAdapter = _
  New SqlDataAdapter(orderSQL, connection)

Dim dataSet As DataSet = New DataSet()
adapter.Fill(dataSet, currentIndex, pageSize, "Orders")
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 Tabelle nur mit fünf Datensätzen gefüllt, aber die gesamte Orders Tabelle wird zurückgegeben. Um die DataSet mit denselben fünf Datensätzen zu füllen, aber nur fünf Datensätze zurückzugeben, verwenden Sie die TOP- und WHERE-Klauseln in Ihrer SQL-Anweisung, wie im folgenden Codebeispiel.

Dim pageSize As Integer = 5

Dim orderSQL As String = "SELECT TOP " & pageSize & _
  " * FROM Orders ORDER BY OrderID"
Dim adapter As SqlDataAdapter = _
  New SqlDataAdapter(orderSQL, connection)

Dim dataSet As DataSet = New DataSet()
adapter.Fill(dataSet, "Orders")
int pageSize = 5;

string orderSQL = "SELECT TOP " + pageSize +
  " * FROM Orders ORDER BY OrderID";
SqlDataAdapter adapter = new SqlDataAdapter(orderSQL, connection);

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

Beachten Sie, dass Sie beim Ausblättern durch die Abfrageergebnisse auf diese Weise den eindeutigen Bezeichner beibehalten müssen, der die Zeilen anordnet, um die eindeutige ID an den Befehl zu übergeben, um die nächste Seite mit Datensätzen zurückzugeben, wie im folgenden Codebeispiel gezeigt.

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

Um die nächste Seite der Datensätze mithilfe der Überladung der Fill-Methode, die die Parameter startRecord und maxRecords verwendet, zurückzugeben, erhöhen Sie den aktuellen Datensatzindex um die Seitengröße und füllen Sie die Tabelle. 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. Möglicherweise soll eine bestimmte Anzahl zurückgegebener Zeilen in einem lokalen Cache beibehalten werden, um die Anzahl der Schleifen zum Datenbankserver zu reduzieren.

currentIndex = currentIndex + pageSize

dataSet.Tables("Orders").Rows.Clear()

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

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

Siehe auch