Colabora
 

Web Site utilizando LinQ

[Ejemplo sencillo del uso de LinQ en un Sitio Web]

 

Fecha: 06/Feb/2011 (28-01-11)
Autor: Hermilson Tinoco Gaviria - hertino17@hotmail.com

 


Introducción

Empecemos por lo básico, que es LINQ? es un componente que Microsoft incluyo en el framework .NET el cual añade la capacidad de realizar consultas nativamente (como en SQL) a través de cualquier lenguaje .NET.

Aquí explico un ejemplo muy sencillo utilizando LinQ sobre un sitio web que consume una clase para realizar la comunicación con los datos, este ejemplo esta implementado utilizando C#.

 

Contenido

La resultado final que se espera con este ejemplo es desarrollar dos páginas Web las cuales permitan ejecutar instrucciones SQL utilizando LinQ. La primera página esta diseñada solo para consulta de información y la segunda para almacenar datos en una tabla.

Diseño de la primera página


Esta primera página consta de un titulo, un control GridView para mostrar los datos y un control Hyperlink para navegar a la segunda página.

Diseño de la segunda página


La segunda página consta de un titulo, de dos controles para capturar y mostrar la información del Perfil, y de dos botones para ejecutar las operaciones de Buscar y Salvar.

Procedimiento
Lo primero que hacemos es adicionar un nuevo componente del tipo Linq To Sql Classes a nuestro proyecto Web.
Después de adicionar el nuevo componente se generan tres nuevos archivos en el proyecto:
1. LinqDb.dbml: es un archivo xml que define el mapeo.
2. LinqDb.dbml.layout: es un archivo xml que utiliza el diseñador.
3. LinqDb.designer.cs: es un archivo de C# donde se definen las clases y el contexto (la conexión).

Desde el Explorador de servidores se adicionan las tablas que se desean relacionar a nuestro proyecto, para este ejemplo debe adicionar al menos tres tablas que se relacionen. sino tiene una conexión a una base de datos en el Explorador debe crearla antes de realizar este proceso. (Al arrastrar generamos la clases de mapeo - clases que representan los objetos de base de datos)

Ahora podemos examinar el visor de clases de Visual Studio y allí se puede visualizar las clases adicionadas automáticamente incluida la clase DataContext. Se adiciona una clase por cada tabla agregada al componente LinQ.

Adicionalmente visual studio adiciona al archivo Web.config la cadena de conexión relacionada con la base de datos.

Clase para la conexión.
Para continuar con el ejemplo adicionamos una nueva clase al proyecto la cual contiene los métodos necesarios para conectarse con las tablas y su datos.

public class clsConexion
{
    LinQ_a_SQLDataContext dc = new LinQ_a_SQLDataContext();
    const int SI = 1;

    internal void Adicionar_Usuario(string nombre, string clave,DateTime fecha)
    {
        Usuarios usuario = new Usuarios();
        usuario.usuario = nombre;
        usuario.clave = clave;
        usuario.estado = SI;
        usuario.fecha_alta  = fecha;
        dc.Usuarios.InsertOnSubmit(usuario);
        dc.SubmitChanges();       
    }
    
    internal Usuarios Consultar_Usuario(int codigo)
    {
        var usu = from u in dc.Usuarios where u.cod_usuario == codigo
                  select u;
        if (usu.Count() > 0)
            return usu.First();    
        else
            return null;
    }

    internal Usuarios Consultar_UsuarioxNombre(string nombre)
    {
        var usu = from u in dc.Usuarios
                  where u.usuario == nombre
                  select u;
        if (usu.Count() > 0)
            return usu.First();
        else
            return null;
    }

    internal void BorrarUsuarioxNombre(string nombre)
    {
        var usu = from u in dc.Usuarios
                  where u.usuario.Contains(nombre)
                  select u;
        dc.Usuarios.DeleteAllOnSubmit(usu);
        dc.SubmitChanges();
    }

    public void Adicionar_Perfil(string nombre, byte estado)
    {
        Perfiles perfil = new Perfiles();
        perfil.perfil = nombre;
        perfil.estado = estado;
        dc.Perfiles.InsertOnSubmit(perfil);
        dc.SubmitChanges();
    }

    public Perfiles Consultar_Perfil(string nombre)
    {
        var leer = from p in dc.Perfiles
                  where p.perfil.Contains(nombre)
                  select p;

        if (leer.Count() > 0)
            return leer.First();
        else
            return null;
    }
}

Después de compilar nuestra nueva clase, pasamos a implementar los métodos de cada página para su correcto funcionamiento.

En la primera página solo vamos a implementar el evento Load de la página, con el fin de leer los datos contenidos en la tabla de Usuarios.

protected void Page_Load(object sender, EventArgs e)
{
    LinQ_a_SQLDataContext dc = new LinQ_a_SQLDataContext();

    var consultar = from p in dc.Usuarios
                    select new {
                        Nombre = p.usuario,
                        Ingreso = p.fecha_alta,
                        Estado = Convert.ToBoolean(p.estado)
                    };

    GridView1.DataSource = consultar.Skip(1).Take(3);
    GridView1.DataBind();
}

En la segunda página tenemos un código más complejo porque debemos permitir buscar los datos del perfil y ademas permitir Salvar nuevos registros.

protected void cmdSalvar_Click(object sender, EventArgs e)
{
    clsConexion obj = new clsConexion();
    obj.Adicionar_Perfil(txtNombre.Text, Convert.ToByte(cboEstado.SelectedValue));
    MostrarDatos(null);

    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myAlert", "alert('El perfil ha sido adicionado.');", true);
}

void MostrarDatos(Perfiles x)
{
    if (x != null)
    {
        try
        {
            txtNombre.Text = x.perfil;
            cboEstado.SelectedIndex = cboEstado.Items.IndexOf(cboEstado.Items.FindByValue(x.estado.ToString()));
        }
        catch (Exception e)
        {}
    }
    else
    {
        txtNombre.Text = String.Empty;
        cboEstado.SelectedIndex = 0;
    }
}

protected void cmdBuscar_Click(object sender, EventArgs e)
{
    clsConexion obj = new clsConexion();
    string v_nombre = txtNombre.Text;
    Perfiles p = obj.Consultar_Perfil(v_nombre);
    MostrarDatos(p);
}

Espacios de nombres usados en el código de este artículo:

using System.Linq;
using System.Data;

 



Compromiso del autor del artículo con el sitio del Guille:

Lo comentado en este artículo está probado (y funciona) con la siguiente configuración:

El autor se compromete personalmente de que lo expuesto en este artículo es cierto y lo ha comprobado usando la configuración indicada anteriormente.

En cualquier caso, el Guille no se responsabiliza del contenido de este artículo.

Si encuentras alguna errata o fallo en algún link (enlace), por favor comunícalo usando este link:

Gracias.


Código de ejemplo (comprimido):

 

Fichero con el código de ejemplo: htinoco_web_con_linQ.zip - 147.00 KB

(MD5 checksum: A63864B8AF716E5FE2C82F8A8AB027BC

 


Ir al índice principal de el Guille