Paginar a través de un resultado de consulta (ADO.NET)

Actualización: November 2007

La paginación a través del resultado de una consulta es un proceso que consiste en devolver los resultados de una consulta en subconjuntos menores de datos, o páginas. Se trata de una práctica frecuente para presentar los resultados a un usuario en fragmentos pequeños y fáciles de administrar.

DataAdapter permite devolver únicamente una página de datos mediante sobrecargas del método Fill. Sin embargo, quizás no sea la mejor opción para paginar a través de resultados de consultas grandes ya que, aunque el DataAdapter rellena la DataTable o el DataSet de destino sólo con los registros solicitados, se siguen utilizando los recursos para devolver toda la consulta. Para devolver una página de datos a partir de un origen de datos sin utilizar los recursos necesarios para devolver toda la consulta, hay que especificar otros criterios adicionales para la consulta que reduzcan las filas devueltas a las filas únicamente necesarias.

Para utilizar el método Fill para devolver una página de datos, especifique un parámetro startRecord que represente el primer registro de la página de datos y un parámetro maxRecords que represente el número de registros de la página de datos.

En el siguiente ejemplo de código se muestra cómo utilizar el método Fill para devolver la primera página del resultado de una consulta cuando el tamaño de la página es de 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");

En el ejemplo anterior, el DataSet sólo se rellena con cinco registros pero se devuelve toda la tabla Pedidos. Para rellenar el DataSet con esos mismos cinco registros, pero devolver únicamente cinco registros, hay que utilizar las cláusulas TOP y WHERE en la instrucción SQL, como en el ejemplo de código siguiente.

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

Hay que tener en cuenta que, al paginar a través del resultado de una consulta de esta forma, hay que conservar el identificador único por el que están ordenadas las filas con el fin de pasar el id. único al comando con el fin de devolver la siguiente página de registros, tal y como se muestra en el ejemplo de código siguiente.

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

Para devolver la siguiente página de registros utilizando la sobrecarga del método Fill que toma los parámetros startRecord y maxRecords, hay que incrementar el índice del registro actual en el tamaño de página y rellenar la tabla. Recuerde que el servidor de base de datos devuelve todos los resultados de la consulta aunque sólo se agregue una página de registros al DataSet. En el siguiente ejemplo de código se vacía el contenido de las filas de la tabla antes de rellenarse con la siguiente página de datos. Quizás se desee conservar un cierto número de filas devueltas en una caché local para reducir los viajes al servidor de base de datos.

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 devolver la siguiente página de registros sin que el servidor de base de datos tenga que devolver toda la consulta, hay que especificar criterios restrictivos en la instrucción SELECT. Como el ejemplo anterior conservaba el último registro devuelto, es posible utilizarlo en la cláusula WHERE con el fin de especificar un punto de partida para la consulta, como se muestra en el ejemplo de código siguiente.

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

Vea también

Otros recursos

DataAdapters y DataReaders (ADO.NET)