Un buen tip [autor desconocido – MSDN]
Ya todos nos sabemos el truco de la paginación con DataGrids en ASP.NET. Funciona de la siguiente manera: cargamos un DataSet [o cualquier bind-able] y lo ligamos al DataGrid, de ahí le modificamos las propiedades de paginación y listo. Hay que hacer algunos cambios en el código que permita modificar el CurrentPageIndex al PageIndex del DataSet. Son alrededor de dos líneas de código y del lado del servidor tenemos que persistir la información dentro de nuestro DataSet ya sea en una variable de sesión, en el ViewState o donde uno quiera.
El problema grave de esto es que si tenemos 100,000 registros dentro de nuestro resultado y lo estamos paginando; digamos en páginas de 25 elementos, de todos modos estamos almacenando en el DataSet 99,975 los cuales serán descartados en cada PostBack.
La mejor manera de evitar esto, es utilizar procedimientos almacenados que nos envien la páginación sobre los resultados manera que el manejador de base de datos se encargue de hacerlo, enviando solo los registros que son necesarios [y la página en la que estamos]. Obviamente esto requiere un poco más de código pero nos mejora muchísimo el rendimiento al obtener información y la paginación de la base de datos.
Este pequeño snippet de código demuestra como hacer el procedimiento almacenado en la tabla de Ordenes de Northwind [nuestra base de datos favorita]:
1 | CREATE PROCEDURE northwind_OrdersPaged |
2 | ( |
3 | @PageIndex int, |
4 | @PageSize int |
5 | ) |
6 | AS |
7 | BEGIN |
8 | DECLARE @PageLowerBound int |
9 | DECLARE @PageUpperBound int |
10 | DECLARE @RowsToReturn int |
11 | |
12 | — First set the rowcount |
13 | SET @RowsToReturn = @PageSize * (@PageIndex + 1) |
14 | SET ROWCOUNT @RowsToReturn |
15 | |
16 | — Set the page bounds |
17 | SET @PageLowerBound = @PageSize * @PageIndex |
18 | SET @PageUpperBound = @PageLowerBound + @PageSize + 1 |
19 | |
20 | — Create a temp table to store the select results |
21 | CREATE TABLE #PageIndex |
22 | ( |
23 | IndexId int IDENTITY (1, 1) NOT NULL, |
24 | OrderID int |
25 | ) |
26 | |
27 | — Insert into the temp table |
28 | INSERT INTO #PageIndex (OrderID) |
29 | SELECT |
30 | OrderID |
31 | FROM |
32 | Orders |
33 | ORDER BY |
34 | OrderID DESC |
35 | |
36 | — Return total count |
37 | SELECT COUNT(OrderID) FROM Orders |
38 | |
39 | — Return paged results |
40 | SELECT |
41 | O.* |
42 | FROM |
43 | Orders O, |
44 | #PageIndex PageIndex |
45 | WHERE |
46 | O.OrderID = PageIndex.OrderID AND |
47 | PageIndex.IndexID > @PageLowerBound AND |
48 | PageIndex.IndexID < @PageUpperBound |
49 | ORDER BY |
50 | PageIndex.IndexID |
51 | |
52 | END |
Solamente del lado del cliente escribimos el código adecuado para manejar la paginación [OnPageChanged] y le decimos que es Custom Paging a nuestro DataGrid y listo.
Cheers! xD
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.