Compartilhar via


Paginação por meio de um resultado de consulta

Aplicável a: .NET Framework .NET .NET Standard

Baixar ADO.NET

A paginação por meio 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 a fim de exibir os resultados para um usuário em partes pequenas e fáceis de gerenciar.

SqlDataAdapter fornece um recurso que permite retornar apenas uma página de dados, por meio de sobrecargas do método Fill. No entanto, essa pode não ser a melhor opção para paginar grandes resultados de consulta porque, embora o DataAdapter preencha o DataTable de destino ou o DataSet apenas com os registros solicitados, ainda serão usados os recursos para retornar a consulta inteira.

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 na consulta que reduzam as linhas retornadas para apenas aquelas necessárias.

Para usar o método Fill a fim de retornar uma página de dados, especifique um parâmetro startRecord (que corresponderá ao primeiro registro da página de dados) e um parâmetro maxRecords (que corresponderá ao número de registros na página de dados).

Exemplo

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 cujo tamanho da página corresponde a cinco registros.

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 a tabela Orders inteira é retornada. Para preencher o DataSet com aqueles mesmos cinco registros, mas retornando apenas eles, use as cláusulas TOP e WHERE na instrução SQL, como mostrado no exemplo de código a seguir.

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

Observação

Ao paginar os resultados da consulta dessa forma, você deve preservar o unique identifier que ordena as linhas, a fim de passar a ID exclusiva para o comando e retornar a próxima página de registros, conforme mostrado no exemplo de código a seguir.

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

Para retornar o next page of records usando a sobrecarga do método Fill que usa os parâmetros startRecord e maxRecords, incremente o índice de registro atual com o tamanho da página e preencha a tabela.

Observação

Lembre-se de que o servidor de banco de dados retorna todos os resultados da consulta, muito embora 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 determinado número de linhas retornadas em um cache local a fim de reduzir os acessos ao servidor de banco de dados.

currentIndex += pageSize;

// Assumes that dataset and adapter are valid objects.
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 precise retornar a consulta inteira, especifique critérios restritivos na instrução SELECT. Como o exemplo anterior preservava o último registro retornado, você pode usá-lo na cláusula WHERE a fim de 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");

Confira também