Comparteix via


Paginar un resultado de consulta

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 proporciona una facilidad para devolver solo una página de datos a través de sobrecargas del método Fill. Sin embargo, esta podría no ser la mejor opción para realizar la paginación de grandes resultados de consulta porque, aunque DataAdapter completa el DataTable o DataSet de destino solo con los registros solicitados, los recursos para devolver la consulta completa aún se utilizan. 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 usar el Fill método para devolver una página de datos, especifique un startRecord parámetro para el primer registro de la página de datos y un maxRecords parámetro para el número de registros de la página de datos.

En el ejemplo de código siguiente se muestra cómo usar el Fill método para devolver la primera página de un resultado de consulta donde el tamaño de 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, está relleno solo con cinco registros, pero se devuelve la tabla completa. Para rellenar con DataSet esos mismos cinco registros, pero solo devolver cinco registros, use las cláusulas TOP y WHERE de 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");

Tenga en cuenta que, al navegar por los resultados de la consulta de esta manera, debe conservar el identificador único que ordena las filas y así pasarlo al comando para obtener la siguiente página de registros, como se muestra en el siguiente ejemplo de código.

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 página siguiente de registros mediante la sobrecarga del método Fill que toma startRecord y maxRecords como parámetros, incremente el índice de registro actual en el tamaño de página y rellene la tabla. Recuerde que el servidor de bases de datos devuelve todos los resultados de la consulta aunque solo se agregue una página de registros al objeto 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 bases 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 bases 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");

Consulte también