Paging del risultato di una query (ADO.NET)
Il paging del risultato di una query corrisponde al processo di restituzione dei risultati di una query in subset di dati di dimensioni inferiori o pagine. Si tratta di una tecnica comunemente utilizzata per la visualizzazione di risultati in blocchi di dimensioni ridotte e di facile gestione.
In DataAdapter è disponibile una funzionalità che consente la restituzione di un'unica pagina di dati, tramite gli overload del metodo Fill. Questa soluzione potrebbe non rivelarsi ottimale per il paging di una quantità elevata di risultati di query, poiché, sebbene DataAdapter compili la DataTable o DataSet di destinazione utilizzando solo i record richiesti, le risorse per la restituzione dell'intera query sono ancora in uso. Per restituire una pagina di dati da un'origine dati senza utilizzare le risorse per la restituzione dell'intera query, specificare dei criteri aggiuntivi per la query, in modo che vengano restituite solo le righe necessarie.
Per utilizzare il metodo Fill per la restituzione di una pagina di dati, specificare startRecord, indicando il primo record della pagina di dati, e un parametro maxRecords, per il numero di record che devono essere contenuti nella pagina di dati.
Nell'esempio di codice seguente viene mostrato come utilizzare il metodo Fill per restituire la prima pagina di un risultato di una query, in cui la dimensione della pagina corrisponde a cinque record.
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");
Nell'esempio precedente il DataSet viene compilato solo con cinque record, ma viene restituita l'intera tabella Orders. Per compilare l'oggetto DataSet con gli stessi cinque record, ma restituire solo cinque record, utilizzare le clausole TOP e WHERE nell'istruzione SQL, come illustrato nell'esempio seguente.
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");
Notare che, quando si esegue in questo modo il paging dei risultati della query, è necessario conservare l'identificatore univoco in base al quale sono ordinate le righe, in modo da passare l'identificatore univoco al comando per restituire la pagina successiva di record, come illustrato nell'esempio seguente.
Dim lastRecord As String = _
dataSet.Tables("Orders").Rows(pageSize - 1)("OrderID").ToString()
string lastRecord =
dataSet.Tables["Orders"].Rows[pageSize - 1]["OrderID"].ToString();
Per restituire la pagina successiva di record utilizzando l'overload del metodo Fill che accetta i parametri startRecord e maxRecords, incrementare l'indice di record corrente sulla base della dimensione della pagina e compilare la tabella. Ricordare che il server database restituisce tutti i risultati della query, anche se al DataSet viene aggiunta solo una pagina di record. Nell'esempio di codice seguente i contenuti delle tabelle vengono cancellati prima che tali tabelle siano compilate con la pagina successiva di dati. Per ridurre i percorsi al server database, è possibile archiviare in una cache locale un determinato numero di righe restituite.
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");
Per restituire la pagina successiva di record senza che il server database restituisca l'intera query, specificare dei criteri restrittivi per l'istruzione SELECT. Poiché nell'esempio precedente l'ultimo record restituito viene conservato, è possibile utilizzare tale record nella clausola WHERE per specificare un punto di partenza per la query, come illustrato nel seguente esempio di codice.
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");