Dela via


Växling via ett frågeresultat

Växling genom ett frågeresultat är processen att returnera resultatet av en fråga i mindre delmängder av data eller sidor. Det här är en vanlig metod för att visa resultat för en användare i små, lätthanterbara segment.

DataAdapter tillhandahåller en funktion för att endast returnera en sida med data, genom överlagringar av metoden Fill. Detta kanske dock inte är det bästa valet för växling genom stora frågeresultat, eftersom även om DataAdapter fyller målet DataTable eller DataSet endast med de begärda posterna används fortfarande resurserna för att returnera hela frågan. Om du vill returnera en sida med data från en datakälla utan att använda resurserna för att returnera hela frågan anger du ytterligare villkor för din fråga som minskar de rader som returneras till endast de som krävs.

Om du vill använda metoden Fyll för att returnera en sida med data anger du en startRecord-parameter , för den första posten på datasidan och en maxRecords-parameter för antalet poster på datasidan.

Följande kodexempel visar hur du använder metoden Fyllning för att returnera den första sidan i ett frågeresultat där sidstorleken är fem poster.

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

I föregående exempel fylls DataSet bara med fem poster, men hela tabellen Beställningar returneras. Om du vill fylla DataSet med samma fem poster, men bara returnera fem poster, använder du satserna TOP och WHERE i SQL-instruktionen, som i följande kodexempel.

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

Observera att när du går igenom frågans resultat på det här sättet måste du bevara den unika identifierare som beställer raderna för att kunna skicka det unika ID:t till kommandot för att returnera nästa sida med poster, som du ser i följande kodexempel.

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

Om du vill returnera nästa sida med poster med hjälp av överlagringen av fyllningsmetoden som tar parametrarna startRecord och maxRecords ökar du det aktuella postindexet efter sidstorleken och fyller tabellen. Kom ihåg att databasservern returnerar hela frågeresultatet trots att endast en sida med poster läggs till i DataSet. I följande kodexempel rensas tabellraderna innan de fylls med nästa sida med data. Du kanske vill bevara ett visst antal returnerade rader i ett lokalt cacheminne för att minska antalet resor till databasservern.

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

Om du vill returnera nästa sida med poster utan att databasservern returnerar hela frågan anger du restriktiva villkor för SELECT-instruktionen. Eftersom föregående exempel bevarade den senaste posten som returnerades kan du använda den i WHERE-satsen för att ange en startpunkt för frågan, som du ser i följande kodexempel.

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

Se även