Partilhar via


Paginação através de um resultado de consulta

A paginação através de um resultado de consulta é o processo de retornar os resultados de uma consulta em subconjuntos menores de dados ou páginas. Essa é uma prática comum para exibir resultados para um usuário em partes pequenas e fáceis de gerenciar.

O DataAdapter fornece um recurso para retornar apenas uma página de dados, através de sobrecargas do método Fill . No entanto, essa pode não ser a melhor opção para paginação por meio de resultados de consulta grandes porque, embora o DataAdapter preencha o destino DataTable ou DataSet apenas com os registros solicitados, os recursos para retornar a consulta inteira ainda são usados. Para retornar uma página de dados de uma fonte de dados sem usar os recursos para retornar a consulta inteira, especifique critérios adicionais para sua consulta que reduzam as linhas retornadas apenas àquelas necessárias.

Para usar o método Fill para retornar uma página de dados, especifique um parâmetro startRecord , para o primeiro registro na página de dados, e um parâmetro maxRecords , para o número de registros na página de dados.

O exemplo de código a seguir mostra como usar o método Fill para retornar a primeira página de um resultado de consulta onde o tamanho da página é cinco registros.

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

No exemplo anterior, o DataSet é preenchido apenas com cinco registros, mas toda a tabela Orders é retornada. Para preencher o DataSet com esses mesmos cinco registros, mas retornar apenas cinco registros, use as cláusulas TOP e WHERE em sua instrução SQL, como no exemplo de código a seguir.

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

Observe que, ao paginar os resultados da consulta dessa maneira, você deve preservar o identificador exclusivo que ordena as linhas, a fim de passar o ID exclusivo para o comando para retornar a próxima página de registros, conforme mostrado no exemplo de código a seguir.

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

Para retornar a próxima página de registros usando a sobrecarga do método Fill que usa os parâmetros startRecord e maxRecords , incremente o índice de registro atual pelo tamanho da página e preencha a tabela. Lembre-se de que o servidor de banco de dados retorna todos os resultados da consulta, mesmo que apenas uma página de registros seja adicionada ao DataSet. No exemplo de código a seguir, as linhas da tabela são limpas antes de serem preenchidas com a próxima página de dados. Talvez você queira preservar um certo número de linhas retornadas em um cache local para reduzir as viagens ao servidor de banco de dados.

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

Para retornar a próxima página de registros sem que o servidor de banco de dados retorne a consulta inteira, especifique critérios restritivos para a instrução SELECT. Como o exemplo anterior preservou o último registro retornado, você pode usá-lo na cláusula WHERE para especificar um ponto de partida para a consulta, conforme mostrado no exemplo de código a seguir.

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

Consulte também