Paginación de resultados de consulta
Se aplica a: .NET Framework .NET .NET Standard
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.
SqlDataAdapter permite devolver únicamente una página de datos mediante sobrecargas del método Fill. Pero es posible que no sea la mejor opción para realizar la paginación por medio de resultados de consultas grandes, ya que, aunque el objeto DataAdapter rellena los elementos DataTable o DataSet de destino solo 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 usar el método Fill a fin de 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.
Ejemplo
En el ejemplo de código siguiente se muestra cómo usar 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.
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 objeto DataSet solo se rellena con cinco registros pero se devuelve la tabla Orders completa. Para rellenar el objeto DataSet con esos mismos cinco registros, pero devolver únicamente cinco registros, use las cláusulas TOP
y WHERE
en la instrucción SQL, como en el ejemplo de código siguiente.
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
Al realizar la paginación por los resultados de la consulta de esta manera, debe conservar el elemento unique identifier
que ordena las filas, a fin de pasar el identificador único al comando para devolver la siguiente página de registros, como se muestra en el ejemplo de código siguiente.
string lastRecord =
dataSet.Tables["Orders"].Rows[pageSize - 1]["OrderID"].ToString();
Para devolver el valor next page of records
mediante la sobrecarga del método Fill que toma los parámetros startRecord y maxRecords, incremente el índice del registro actual por el tamaño de página y rellene la tabla.
Nota
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 += pageSize;
// Assumes that dataset and adapter are valid objects.
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");