Paginar DataSet
[Paginar resultados de una sentencia SQL en .NET utilizando un DataSet]

Fecha: 02/Nov/2004 (02 de Noviembre de 2004)
Autor: Luis Ruiz Pavón [[email protected]]

 


Hola a todos de nuevo, en esta ocasión voy a explicar como paginar los resultados de una sentencia SQL, utilizando para ello un DataSet. Para obtener la información nos conectaremos a una base de datos es SQL Server (El fichero zip incluye el script de la tabla) y el nombre de la BB.DD es indiferente. La cadena de conexión la agregaremos al Web.config.

Manos a la obra!!!

Creamos un proyecto Web en C# desde Visual Studio .NET y añadimos un WebForm llamado default.aspx. A continuación pasamos a la vista de html e insertamos las siguiente directivas:

<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Configuration" %>
<%@ Import Namespace="System.Data" %>
Insertamos entre las etiquetas <HEAD></HEAD> el siguiente código para dar un aspecto bonito a los resultados.
<style>
.TDMIO {
    FONT: 70% verdana, arial, helvetica, sans-serif
    }
    A:link {
        COLOR: #28469a; TEXT-DECORATION: none
    }
    A:visited {
        COLOR: #28469a; TEXT-DECORATION: none
    }
    A:hover {
        COLOR: #e03f7b; TEXT-DECORATION: blink
    }
</style>

Una vez insertada la etiqueta de estilos vamos con el código de la aplicación. Este código irá entre las etiquetas <% %> y dentro a su vez de las etiquetas

<form id="default" method="post" runat="server"></form>
//  Variable enteras para recorrer con 2 for el DataSet 
int mniFor;
int mnjFor;
//  Nº de registros visibles por página(Tamaño de paginación) 
int mnPaginacion = 5;
//  Nº de página actual 
int mnNumPag=1;
//  Nº total de páginas 
int mnTotalPags=0;
//  Variable entera para reazlizar cálculos
int mnCont;
//  Almacena el Nº de registros restantes para mostrar en la última página 
int mnResto;
//  Variable entera para saber el hasta donde va el for 
int mnHastaFor;
//  Variable entera para saber el valor inicial del primer indice del for 
int mnDesdeFor;
//  Nombre de la tabla 
const string sTabla = "USUARIOS";
//  Variables para el acceso a SQL SERVER 
string cadConexion = null;
string sQuery = null;
SqlConnection conn;
SqlDataAdapter data;
DataSet datos;
        
//  Obtenemos la cadena de conexión 
cadConexion = (String)ConfigurationSettings.AppSettings["strConnect"];

//  Creamos la sentencia SQL
sQuery = "SELECT * " + 
" FROM " + sTabla;
                             
//  Establecemos la conexión con SQL Server
conn = new SqlConnection(cadConexion);
data = new SqlDataAdapter(sQuery,conn);
                
//  Creamos el objeto DataSet
datos = new DataSet();
                
//  Rellenamos el DataSet 
data.Fill(datos, sTabla);
                
//  Almacenamos el Nº de página actual 
if (Request.QueryString["pag"] != null)
{
    mnNumPag = int.Parse(Request.QueryString["pag"]);
    //  Si es menor que 0, la página actual será la primera 
    if (mnNumPag < 0)
    {
        mnNumPag = 1;
    }
}

//  Almacenamos el Nº de filas de la consulta 
mnCont = datos.Tables[sTabla].Rows.Count;
                
//  Si existen resultados
if (mnCont > 0)
{
    //  Calculamos el Nº total de páginas 
    while (mnCont > 0)
    {
        mnCont -= mnPaginacion;
        mnTotalPags++;
    }
                    
    // Si el resto de registros es menor que el tamaño de paginación minimo
    // incrementamos el total de páginas en 1 y almacenamos el Nº de registros 
    // restantes en la variable mnResto
    if (mnCont > 0)
    {
        mnTotalPags++;
        mnResto = mnCont;
    }
                    
    //  Calculamos hasta donde llegará el primer indice del for 
    mnHastaFor = mnNumPag * mnPaginacion;
    //  Calculamos el valor inicial del primer indice del for 
    mnDesdeFor = mnHastaFor - mnPaginacion; 
                    
    // Si el valor hasta el que llegará el indice del for es
    // mayor que el número de filas
    if (mnHastaFor > datos.Tables[sTabla].Rows.Count)
    {
        //  Recalculamos los indices 
        mnHastaFor = datos.Tables[sTabla].Rows.Count;
        mnDesdeFor = ((mnNumPag - 1) * mnPaginacion);
    }
                    
    //  Pintamos la tabla con los datos 
    Response.Write("<TABLE cellSpacing=0 cellPadding=0 border=0  class=TDMIO align='center' width='90%'>");
    Response.Write("<TR bgcolor=#3c65c0>");
    Response.Write("<TD width='33%' align=center><FONT color=#ffffff>STRONG>Nombre</STRONG></FONT></TD>");
    Response.Write("<TD width='33%' align=center><FONT color=#ffffff>STRONG>Apellidos</STRONG></FONT></TD>");
    Response.Write("<TD width='33%' align=center><FONT color=#ffffff>STRONG>Teléfono</STRONG></FONT></TD>");
    Response.Write("</TR>");

    //  Pintamos los resultados
    for (mniFor = mnDesdeFor; mniFor < mnHastaFor; mniFor++)
    {
        Response.Write("<TR bgcolor=#EBF0FC>");
        for(mnjFor = 0; mnjFor < datos.Tables[sTabla].Columns.Count; mnjFor++)
        {
            Response.Write("<TD width='33%' align=center>" + datos.Tables[sTabla].Rows[mniFor][mnjFor] + "</TD>");
        }
        Response.Write("</TR>");
    }
    Response.Write("</TABLE>");
                    
    //  Pintamos los números de las páginas y recalcamos en que página se encuentra el usuario 
    Response.Write("<TABLE align=center class=TDMIO>");
    Response.Write("<TR>");
    for (mniFor = 1; mniFor <= mnTotalPags; mniFor++)
    {
        if (mniFor == mnNumPag)
        {
            Response.Write("<TD><A HREF=default.aspx?pag=" + mniFor + "><FONT color=#e03f7b><STRONG>" + mniFor + "</STRONG></FONT></A></TD>");
        }
        else
        {
            Response.Write("<TD><A HREF=default.aspx?pag=" + mniFor + ">" + mniFor + "</A></TD>");
        }
    }
    Response.Write("</TD>");
    Response.Write("</TABLE>");
}
//  Mostramos un mensaje indicando al usuario que no hay datos
else
{
    Response.Write("<TABLE cellSpacing=0 cellPadding=0 border=0  class=TDMIO align='center' width='90%'>");
    Response.Write("<TR>");
    Response.Write("<TD align=center><FONT color=#e03f7b><STRONG>No se han encontrado coincidencias</STRONG></FONT></TD>");
    Response.Write("</TR>");
    Response.Write("</TABLE>");
}
 

El fichero Web.Config

Por último nos queda añadir al fichero Web.config la información sobre la cadena de conexión. Para ello lo editamos y añadimos la siguiente información dentro de las etiquetas <configuration></configuration>:

  <appSettings>
      <add key="strConnect" value="data source=SERVIDOR;initial catalog=BASE DE DATOS;password=LA TUYA;persist security info=True;user id=EL TUYO;packet size=4096" />
  </appSettings>   

Los resultados:

Aquí os muestro un pequeño detalle:

Espero que os sirva. Un Saludo.


ir al índice

Fichero con el código de ejemplo: luis_paginarDataset.zip - Tamaño 19 KB