InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
SubVersion y Visual Studio
Encriptación con AES Rijndael - Ejemplo
TripleDES - Un ejemplo practico en C#
Insertar una marca de agua en documentos PDF
Simular TRUNC en SQL Server
Serialización: XmlSerializer y BinaryFormater
Handler para manipular imagenes
Conversiones de tipos personalizadas (VB y C#)
Compresión por gzip y deflate
La página Web que está abriendo contiene tanto elementos seguros como no seguros.


LinQ To SQL - Un ejemplo sencillo

    En este articulo vamos a intentar explicar como funciona Linq To SQL. Para empezar diremos que Linq To Sql es un ORM ligero para bases de datos, con soporte para Linq integrado, disponible en la nueva versión de .NET framework.

    Para quienes no sepan que es un ORM diremos que es un mapeo entre objetos de bases de datos y objetos de un lengunaje de programación, en nuestro caso serán clases de C#. Es decir, a cada objeto de la base de datos le corresponde un objeto (Clase) de C#.

    Lo primero que vamos a necesitar para desarrollar nuestro ejemplo es una pequeña base de datos de SQL Server 2005, que crearemos ejecutando el siguiente script.

 

CREATE DATABASE LINQDB

GO

USE LINQDB

GO

 

if exists (

select 1

from sysobjects

where id = object_id('Perfiles')

and type = 'U'

)

drop table Perfiles

go

 

if exists (

select 1

from sysobjects

where id = object_id('Usuarios')

and type = 'U'

)

drop table Usuarios

go

 

if exists (

select 1

from sysobjects

where id = object_id('UsuariosPerfiles')

and type = 'U'

)

drop table UsuariosPerfiles

go

/*==============================================================*/

/* Table: Perfiles */

/*==============================================================*/

create table Perfiles

(

CodPerfil int identity,

Perfil varchar(100) not null,

Activo char(1) not null

constraint CKC_ACTIVO_PERFILES

check (Activo in ('S','N')),

constraint PK_PERFILES

primary key (CodPerfil)

)

go

/*==============================================================*/

/* Table: Usuarios */

/*==============================================================*/

create table Usuarios

(

CodUsuario int identity,

Usuario varchar(255) not null,

Clave varchar(255) not null,

FxAlta datetime not null,

Activo char(1) not null

constraint CKC_ACTIVO_USUARIOS

check (Activo in ('S','N')),

constraint PK_USUARIOS

primary key (CodUsuario)

)

go

/*==============================================================*/

/* Table: UsuariosPerfiles */

/*==============================================================*/

create table UsuariosPerfiles

(

CodUsuario int not null,

CodPerfil int not null,

constraint PK_USUARIOSPERFILES

primary key (CodUsuario, CodPerfil)

)

go

alter table UsuariosPerfiles

add constraint FK_USUARIOS_REFERENCE_USUARIOS

foreign key (CodUsuario)

references Usuarios (CodUsuario)

go

alter table UsuariosPerfiles

add constraint FK_USUARIOS_REFERENCE_PERFILES

foreign key (CodPerfil)

references Perfiles (CodPerfil)

go

    La base de datos es muy sencilla y contiene solo tres tablas:

  • Usuarios - Que contiene la lista de usuarios.
  • Perfiles  - Que contiene la lista de perfiles.
  • UsuariosPerfiles - Que define los perfiles asignados a cada usuario.

    En realidad en el articulo solo utilizaremos la tabla de usuarios, pero incluimos tres para demostrar como el asistente de Visual Studio genera multiples clases con Linq To Sql.

    Abrimos nuestro Visual Studio 2008 y creamos un nuevo proyecto de tipo Win Forms - es solo la elección que yo he hecho, pero podemos usar Linq To Sql en cualquier proyecto!.

     En primer lugar, seleccionamos añadir nuevo elemento y seleccionamos Linq To Sql Classes, llamaremos al archivo LinqDb.dbml. 

 

[Ampliar Imagen]

    Con esta acción debemos tener tres nuevos archivos en el proyecto.

  • LinqDb.dbml - es archivo xml que define el mapeo.
  • LinqDb.dbml.layout - es un archivo xml que utiliza el diseñador.
  • LinqDb.designer.cs. - archivo de C# donde se definen las clases y el contexto (la conexión). 


[Ampliar Imagen]

    Lo siguiente que debemos hacer es definir una conexión a nuestra base de datos. Abrimos el explorador de servidores y añadimos una nueva conexión.


[Ampliar Imagen]

    Probamos la conexión y guardamos.

    Lo siguiente que vamos a hacer es generar las clases de mapeo con la base de datos. En el explorador del proyecto hacemos doble click en el archivo Linqdb.dbml - con lo que Visual Studio abrirá el diseñador gráfico.

    En la ventana del explorador de servidores, seleccionamos la base de datos que hemos creado al inicio del articulo y desplegamos las tablas.

[Ampliar Imagen]

    Seleccionamos las tablas que queramos mapear a C# y arrastramos sobre el diseñador. Al arrastrar generamos la clases de mapeo - clases que representan los objetos de base de datos.


[Ampliar Imagen]

    Visula Studio nos preguntará si queremos almacenar la información de la conexión a la base de datos en el archivo de configuración de la aplicación.

    Una vez hecho esto, podemos examinar el visor de clases, y veremos que se han añadido las siguientes clases a nuestro proyecto:

  • Una clase DataContext - Que representa el contexto de la conexión.
  • Una clase por cada tabla que hayamos seleccionado. Cada clase tendrá una propiedad por cada campo de la tabla a la que representa.


[Ampliar Imagen]

    En nuestro proyecto se han creado las siguientes clases:

  • LinqDbDataContext
  • Usuarios
  • Perfiles
  • UsuariosPerfiles

    La explicación de estas clases la abordaremos es futuros articulos, pero es importante destacar que si queremos hacer algún cambio en las clase generadas debemos hacerlo en un archivo aparte, aprobechando que son clases parciales. De esta forma podremos regenerar el ORM en cualquier momento sin afectar a nuestro código.

    De momento, Visual Studio ha realizado todo el trabajo por nosostros.

    Con todo esto añadimos un formulario a nuestro proyecto, en el colocamos tres campos para grabar datos en la tabla de usuarios - el nombre de usuario, la clave de acceso y la fecha de alta.


[Ampliar Imagen]

    Escribimos la siguiente clase LinqTest, que dará de alta y buscará usuarios. Tiene los siguientes métodos:

  • AddUsuario - que dará de alta un usuario en la base de datos
  • QueryUsuarioByCodigo - que utilizará Linq para recuperar los datos de un usuario.

 

partial class LinqTest

{

LinqDbDataContext dc = new LinqDbDataContext();

const char SI = 'S';

internal void AddUsuario(string nombre, string clave,

DateTime fecha)

{

Usuarios usuario = new Usuarios();

usuario.Usuario1 = nombre;

usuario.Clave = clave;

usuario.Activo = SI;

usuario.FxAlta = fecha;

dc.Usuarios.InsertOnSubmit(usuario);

dc.SubmitChanges();

//Probamos si recupera bien los identitys

MessageBox.Show(

String.Format("Se ha dado de alta el usuario {0}
con el código {1}"
,

nombre,

usuario.CodUsuario.ToString())

);

}

 

internal Usuarios QueryUsuarioByCodigo(int codigo)

{

var usu = from u in dc.Usuarios

where u.CodUsuario == codigo

select u;

if (usu.Count() > 0)

return usu.First();

else

return null;

}

}

    Y ahora el código del formulario para consumir la clase, también muy sencillo:

 

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

 

private void cmdAlta_Click(object sender, EventArgs e)

{

// Damos de alta el registro e inicializamos

LinqTest obj = new LinqTest();

obj.AddUsuario( txtUsuario.Text ,

txtClave.Text,

dtpFxAlta.Value);

PonerDatosEnPantalla(null);

}

 

private void cmdBuscar_Click(object sender, EventArgs e)

{

// Buscamos y ponemos los datos en pantalla.

LinqTest obj = new LinqTest();

frmBuscar f = new frmBuscar();

f.ShowDialog();

int codUsuario = f.ReturnValue;

Usuarios u = obj.QueryUsuarioByCodigo(codUsuario);

PonerDatosEnPantalla(u);

}

 

void PonerDatosEnPantalla(Usuarios u)

{

if (u != null)

{ // Ponemos los datos

txtUsuario.Text = u.Usuario1;

txtClave.Text = u.Clave;

dtpFxAlta.Value = u.FxAlta;

}

else

{ // Inicializamos el formulario

txtUsuario.Text = String.Empty ;

txtClave.Text = String.Empty;

dtpFxAlta.Value = DateTime.Now;

}

}

}

    El código es muy sencillo, pero lo explicamos brevemente:

  • Boton de alta (cmdAlta_Click) - crea una instancia de LinqTest y le pasa los valores del formulario para que dé de alta un registro.
  • Botón de búsqueda (cmdBuscar_Click) - pide al usuario un código y utilizando una instancia de LinqTest consulta los datos para mostrarlos en pantalla.

    Como podemos ver el código se ayuda un formulario de busqueda, tambien muy sencillo.


[Ampliar Imagen]

    Por si alguien quiere el código del formulario de busqueda ...

 

public partial class frmBuscar : Form

{

public frmBuscar()

{

InitializeComponent();

}

 

private void cmdBuscar_Click(object sender, EventArgs e)

{

this.Close();

}

 

public int ReturnValue

{

get { int i = 0;

int.TryParse(txtCodigo.Text,out i);

return i;

}

}

}

    Pues bien, con esto terminamos. Saludos y hasta la proxima. DJK.


 Versión para imprimir  Foros de consulta

 
VB por Sergio
Respuesta recibida el [08/04/2008 04:07:33]
No tienes esto mismo en VB?

 
Pregunta por Javier
Respuesta recibida el [09/04/2008 08:48:23]
Primero d todo me parece que lo explicate bastante bien. Esta herramienta se articula con el diseño de 3 capas??? y remplaza o se incrusta en alguna??????

 
Excelente por DVD
Respuesta recibida el [05/05/2008 10:11:19]
Gracias por el ejemplo. 
¿Es posible configurar la conexion mediante un archivo de configuracion y lograr los mismos resultados?

 
Problema por JC
Respuesta recibida el [03/07/2008 05:18:13]
Al arrastrar las tablas al diseñador, se muestran pero no generan ninguna clase; cual sera el problema?????????

 
Informacion con SQL 2008 por Cesar Fonseca
Respuesta recibida el [28/08/2008 02:03:48]
es posible aplicar linq to sql con sql 2008?
gracias

 
Ok por yo
Respuesta recibida el [29/08/2008 01:27:10]
joto

 
yo por yo
Respuesta recibida el [02/09/2008 10:21:39]
re jotiiissssiimoo

 
Muy bueno por EDG
Respuesta recibida el [09/09/2008 10:51:23]
muy buena explicacion me has aclarado muchas dudas, te felicito y muchisimas gracias por el aporte del conocimiento

 
Por favor me ayenden (urgente) por Lans
Respuesta recibida el [07/12/2008 06:00:46]
Hola a todos los especto de .net,C#,
Tengo que hacer un metamodelo en UML realizando un indizador de informacion estructurado y almacenarlo en un reposito de internet. (Puede ser con cualquiera de estos codigos: (.net,c++,XMl,BD,SQL,ect...)
favor me den un ejemplo o la idea de como hacerlo.gracias mi correo es: rangepc@yahoo.fr

 
Gracias, esta todo clarito por La Res
Respuesta recibida el [28/01/2009 03:28:54]
Excelente explicacion, mejor se daña.

 
Muy bueno por Diego
Respuesta recibida el [26/06/2009 03:14:20]
Muy burno, era lo que buscaba

 
Felicitaciones por Alex
Respuesta recibida el [11/11/2009 03:31:30]
Super buen tutorial, se agradece a personas como tu que aportan de forma clara y sencilla, millon gracias otra vez amigo!


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



 Versión para imprimir

LinQ To SQL - Un ejemplo sencillo
Autor: Pedro Herrarte Sánchez
Visitas: 18022 Fecha de publicación: 01/07/2008
Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación.

Posee mas de diez años de experiencia trabajando para las principales empresas de España.

Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).

Es fundador, diseñador y programador de www.devjoker.com.




Visitas: 111 | Comentarios: 3 | Archivo: Articulos
02/02/2010 iPad vs Telesketch
Visitas: 811 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 767 | Comentarios: 3 | Archivo: Articulos
Visitas: 3183 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14571 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1499 | Comentarios: 3 | Archivo: Articulos
Visitas: 697 | Comentarios: 2 | Archivo: Articulos
Visitas: 369 | Comentarios: 0 | Archivo: Articulos
Visitas: 2034 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
certificado de pensiones del bbva horizonte por danger ... [Actualidad] 127 12/01/2010
certificacion cesantias porvenir por martha perez ... [Actualidad] 6 04/03/2010
Solicitud certificado de afiliaciones a pensiones y cesantias proteccion por hz ... [Actualidad] 60 10/02/2010
cerificado fondo horizonte de pensiones y cesantias por carlos fideligno torres herrera ... [Actualidad] 148 18/01/2010
certificado de afiliacion por EDDY ... [Actualidad] 0 14/03/2010
Cursores por nopodes ... [ORACLE] 0 14/03/2010
peticion urgente mi nombre es juan pablo osorio cardona cc 71115218 por juancho ... [Actualidad] 0 14/03/2010
peticion por juancho ... [Actualidad] 0 14/03/2010
estrato de pencion por carlos antonio mateus gomez ... [Actualidad] 0 14/03/2010
quiero aprender c# por alcapego ... [C#] 4 16/02/2008
certificado pensiones horizonte por angela patricia rodriguez ... [Actualidad] 140 26/01/2010
certificado de penciones y cesantias por fredy ... [Actualidad] 2 29/01/2010

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
26/08/2007 Transacciones en Transact SQL    forma parte de...Tutorial de Transact SQL
16/08/2007 Borrar datos en Transact SQL    forma parte de...Tutorial de Transact SQL
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL
01/08/2007 Actualizar datos en Transact SQL    forma parte de...Tutorial de Transact SQL
12/01/2006 Introducción a PLSQL    forma parte de...Tutorial PL/SQL
27/10/2006 Eventos    forma parte de...Tutorial C#
29/12/2007 Cómo colocar el foco (cursor) en un control en ASP.net
21/07/2007 Insertar datos en Transact SQL    forma parte de...Tutorial de Transact SQL
29/05/2006 J2EE Y .NET: LA RIVALIDAD PERMANENTE
22/02/2008 Cómo consumir un Servicio WCF en vez de un Web Service

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]