Paged Results on DataGrid

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


Comentarios

Deja una respuesta