Condividi tramite


Paging di un risultato di query

Si applica a: .NET Framework .NET .NET Standard

Scarica 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 usata per la visualizzazione di risultati in blocchi di dimensioni ridotte e di facile gestione.

In SqlDataAdapter è 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, perché, anche se DataAdapter compila la classe DataTable o DataSet di destinazione usando 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 usare 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 usare il metodo Fill per la restituzione di una pagina di dati, specificare un parametro 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.

Esempio

L'esempio di codice seguente mostra come usare il metodo Fill per restituire la prima pagina di un risultato di una query, in cui la dimensione della pagina corrisponde a cinque record.

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 la classe DataSet viene compilata solo con cinque record, ma viene restituita l'intera tabella Orders. Per compilare la classe DataSet con gli stessi cinque record, ma restituire solo cinque record, usare le clausole TOP e WHERE nell'istruzione SQL, come illustrato nell'esempio seguente.

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

Nota

Quando si esegue il paging dei risultati della query in questo modo, è necessario mantenere l'elemento unique identifier che ordina le righe, per passare l'ID univoco al comando in modo da restituire la pagina successiva di record, come illustrato nell'esempio di codice seguente.

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

Per restituire l'elemento next page of records usando 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.

Nota

Ricordare che il server di database restituisce tutti i risultati della query, anche se a 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 += pageSize;

// Assumes that dataset and adapter are valid objects.
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 usare 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");

Vedi anche