Door een queryresultaat navigeren
Het bladeren door een queryresultaat is het proces van het retourneren van de resultaten van een query in kleinere subsets met gegevens of pagina's. Dit is een veelvoorkomende procedure voor het weergeven van resultaten aan een gebruiker in kleine, eenvoudig te beheren segmenten.
De DataAdapter biedt een faciliteit voor het retourneren van alleen een pagina met gegevens, via overbelastingen van de fill-methode . Dit is echter mogelijk niet de beste keuze voor het bladeren door grote queryresultaten omdat, hoewel de DataAdapter het doel DataTable of DataSet alleen de aangevraagde records vult, de resources om de hele query te retourneren, nog steeds worden gebruikt. Als u een pagina met gegevens uit een gegevensbron wilt retourneren zonder de resources te gebruiken om de hele query te retourneren, geeft u aanvullende criteria op voor uw query waarmee de rijen worden beperkt die alleen naar de vereiste rijen worden geretourneerd.
Als u de opvulmethode wilt gebruiken om een pagina met gegevens te retourneren, geeft u een parameter startRecord op, voor de eerste record op de pagina met gegevens en een parameter maxRecords , voor het aantal records op de pagina met gegevens.
In het volgende codevoorbeeld ziet u hoe u de methode Fill gebruikt om de eerste pagina van een queryresultaat te retourneren waarbij het paginaformaat vijf records is.
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");
In het vorige voorbeeld is de DataSet alleen gevuld met vijf records, maar de hele tabel Orders wordt geretourneerd. Als u de DataSet wilt vullen met dezelfde vijf records, maar slechts vijf records wilt retourneren, gebruikt u de TOP- en WHERE-componenten in uw SQL-instructie, zoals in het volgende codevoorbeeld.
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");
Houd er rekening mee dat wanneer u op deze manier door de query bladert, de unieke id moet behouden die de rijen rangschikt om de unieke id door te geven aan de opdracht om de volgende pagina met records te retourneren, zoals wordt weergegeven in het volgende codevoorbeeld.
Dim lastRecord As String = _
dataSet.Tables("Orders").Rows(pageSize - 1)("OrderID").ToString()
string lastRecord =
dataSet.Tables["Orders"].Rows[pageSize - 1]["OrderID"].ToString();
Als u de volgende pagina met records wilt retourneren met behulp van de overbelasting van de fill-methode die de parameters StartRecord en maxRecords gebruikt, moet u de huidige recordindex verhogen met het paginaformaat en de tabel vullen. Houd er rekening mee dat de databaseserver de volledige queryresultaten retourneert, ook al wordt er slechts één pagina met records toegevoegd aan de DataSet. In het volgende codevoorbeeld worden de tabelrijen gewist voordat ze worden gevuld met de volgende pagina met gegevens. Mogelijk wilt u een bepaald aantal geretourneerde rijen in een lokale cache behouden om de verplaatsingen naar de databaseserver te verminderen.
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");
Als u de volgende pagina met records wilt retourneren zonder dat de databaseserver de hele query retourneert, geeft u beperkende criteria op voor de SELECT-instructie. Omdat in het voorgaande voorbeeld de laatste geretourneerde record behouden blijft, kunt u deze in de WHERE-component gebruiken om een beginpunt voor de query op te geven, zoals wordt weergegeven in het volgende codevoorbeeld.
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");