Data paging: Paginazione dei risultati

Grazie al linguaggio ASP.NET, estrarre records da una tabella di un database e riportarli in forma tabulare su una pagina web è piuttosto semplice. Basta impostare la proprietà DataSource nell' oggetto DataGrid ad un DataSet contenente i records. Se il numero dei records è maggiore della dimensione dello schermo, sarà possibile sfruttare il meccanismo di paginazione contenuto nella DataGrid. Ottimo metodo questo, senza dubbio, che diventa però lento nel caso in cui il database da cui estrarre i records risulti di grandi dimensioni.Viene impiegato infatti diverso tempo non tanto nell' estrazione dei records, quanto piuttosto nella loro suddivisione in pagine. Ond' evitare noiose attese ai visitatori, è bene ricorrere al quella che in gergo viene chiamata "effective data paging"; questa richiede due parametri, PageSize e CurrentPage ed è possibile solo facendo uso di una stored procedure. In questa si andrà a lavorare con due nuove funzioni T-SQL; grazie a ROW_NUMBER si potranno numerare i records in maniera crescente, dal primo pubblicato all' ultimo; travite OVER invece, si potrà specificare la colonna che avrà un valore numerico sequenziale. Con SQL 2005, come per SQL 2000, è necessario inserire i dati in una tabella temporanea, che non occuperà comunque tanto spazio, ne rallenterà vistosamente le operazioni. Ecco il codice della stored procedure:

CREATE PROCEDURE [dbo].[sproc_get_clients]
    @PageSize [int] = -1,
    @CurrentPage [int] = -1
WITH EXECUTE AS CALLER
AS
    SELECT
        ROW_NUMBER() OVER(ORDER BY client_name ASC) AS rownum,
            client_id,
            client_name
        INTO
            #tmp_tbl_client
        FROM
            tbl_client

        CREATE UNIQUE CLUSTERED INDEX
            idx_uc_rownum
        ON
            #tmp_tbl_client(rownum)

        SELECT
            rownum,
            client_id,
            client_name,
        FROM 
            #tmp_tbl_client
        WHERE
            rownum BETWEEN (@CurrentPage-1)*@PageSize+1 AND @CurrentPage*@PageSize
        ORDER BY
            client_name ASC

Ond' evitare di riprogrammare lo stesso oggetto ADO.NET più e più volte, viene in aiuto l' Enterprise Library, scaricabile da qui. Nell' ultima versione risulta indipendente dal database e non vengono richieste modifiche nel trasporto di codice Oracle su SQL Server e viceversa. Per maggiori informazioni sul prodotto, invito ad effettuare ricerche su Google, salterà alla luce una vastà mole di materiale.

Nel nostro esempio andremo a lavorare su due livelli: quello dei dati si connetterà al database, attivando la stored procedure, mentre quello della presentazione gestirà la DataGrid.

Implementare il DataGrid: mentre si impaginano i records all' interno dello spazio della pagina, la sorgente dati conterrà l' esatto numero di records che verrà mostrato in ciascuna pagina. Dobbiamo integrarvi una paginazione standard, cosa non difficile da fare, dal momento che richiede unicamente tre parametri. Nella classe della griglia dati bisognerà impostare la proprietà AllowCustomPaging a "True" , così che si possa definire il conteggio degli elementi virtuali.

La proprietà VirtualItemCount fa in modo che il DataGrid impagini il numero di records da noi richiesto, invece di impaginare tutti quelli contenuti. Ecco come risulterà la griglia, lato codice:

Nel Data Layer:

Public Function getClientCount() As Integer
    Dim clientCount As Integer = 0

    Try
        Dim dbCommandWrapper As DBCommandWrapper = _
            objDatabase.GetSqlStringCommandWrapper( _
            "SELECT COUNT(client_id) FROM tbl_client")
        clientCount = Convert.ToInt32(objDatabase.ExecuteScalar(dbCommandWrapper))
    Catch ex As Exception
        Throw New Exception("Error getting client count: " & ex.Message)
    End Try

    Return clientCount
End Function

Nel Presentation Layer:

Function getItemCount()
    Dim itemCount As Integer = 0
    Dim client As New clientHandler

    Try
        client.useDefaultDatabase()
        itemCount = client.getClientCount()
    Catch ex As Exception
        messageLabel.Text = "Error getting number of records: " & ex.Message
    End Try

    Return itemCount
End Function

clientDataGrid.VirtualItemCount = getItemCount()

Infine, per impostare la pagina corrente basterà:

Sub clientDataGrid_PageIndexChanged(ByVal sender As Object,
    ByVal e As DataGridPageChangedEventArgs)

    clientDataGrid.CurrentPageIndex = e.NewPageIndex
    Call bindGrid(clientDataGrid.PageSize, e.NewPageIndex + 1)

End Sub

A questo punto non resta che rilegare la griglia alla sorgente dati:

Sub bindGrid(ByVal pageSize As Integer, ByVal currentPage As Integer)
    Dim client As New clientHandler

    Try
        client.useDefaultDatabase()
        Dim objDataSet As DataSet = Nothing
        objDataSet = client.getClients(pageSize, currentPage)
        clientDataGrid.DataSource = objDataSet.Tables(0)
        clientDataGrid.DataBind()
    Catch ex As Exception
        messageLabel.Text = "Error binding grid: " & ex.Message
    End Try
End Sub

Il risultato sarà una griglia dati in grado di muoversi rapidamente in mezzo a milioni e milioni di records.

Per avere il quadro riassuntivo del tutto, è disponibile il download della sorgente dell' esempio sopra proposto.



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Redazione
Condividi le tue opinioni su questo articolo!