Archivos Mensuales: enero 2011

Usando Enterprise Library en VS2008


Como he dicho anteriormente, utilizaremos el Enterprise Library para conectarnos a la base de datos del webservice que creamos con anterioridad por diversión, lo cual implica que hagamos una construcción más seria del mismo, así que diseñamos un proyecto nuevo para que resulte más interesante la situación y mucho más comprensible el uso del sistema.

Definición del WebService: El webservice nos permitirá acceder a una base de datos en la tabla de usuario, por lo tanto el Webservice tendrá los metodos ObtenerUsuarios, ModificarUsuario, EliminarUsuario, AgregarUsuario

La tabla quedará del siguiente modo:

USE [Passport]
GO
CREATE TABLE [dbo].[Usuario](
[UsuarioId] [int] IDENTITY(1,1) NOT NULL,
[Nombre] [varchar](50) NOT NULL,
[Paterno] [varchar](50) NOT NULL,
[Materno] [varchar](50) NOT NULL,
[Correo] [varchar](100) NOT NULL,
[Password] [varchar](20) NOT NULL,
CONSTRAINT [PK_Usuario] PRIMARY KEY CLUSTERED
(
[UsuarioId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Los procedimientos quedan de la siguiente manera:

Insersion de Usuarios:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:
-- Create date:
-- Description:
-- =============================================
CREATE PROCEDURE UsuarioIns(
-- Parametros del SP
@Nombre varchar(50),
@Paterno varchar(50),
@Materno varchar(50),
@Correo varchar(100),
@Password varchar (20)
)
AS
BEGIN
-- SET NOCOUNT ON se añade para prevenir resultados extras
-- que interfieran con los elementos de un select.
SET NOCOUNT ON;
-- Insertamos el procedimiento aqui.
INSERT INTO Usuario (Nombre,Paterno,Materno,Correo,Passwd) VALUES (@Nombre,@Paterno,@Materno,@Correo,@Password)
END
GO

Obtener un Usuario:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:
-- Create date:
-- Description:
-- =============================================
CREATE PROCEDURE UsuarioSel(
-- Parametros del SP
@Correo varchar(100),
@Password varchar (20)
)
AS
BEGIN
-- SET NOCOUNT ON se añade para prevenir resultados extras
-- que interfieran con los elementos de un select.
SET NOCOUNT ON;
-- Insertamos el procedimiento aqui.
SELECT UsuarioId, Nombre,Paterno,Materno,Correo FROM Usuario WHERE Correo=@Correo AND Passwd=@Password
END
GO

Obtiene la lista de usuarios:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        Castán Gutiérrez>
-- Create date:
-- Description:
-- =============================================
CREATE PROCEDURE UsuariosSel(
-- Parametros del SP
)
AS
BEGIN
-- SET NOCOUNT ON se añade para prevenir resultados extras
-- que interfieran con los elementos de un select.
SET NOCOUNT ON;
-- Insertamos el procedimiento aqui.
SELECT UsuarioId, Nombre,Paterno,Materno,Correo FROM Usuario
END
GO

Actualiza un usuario:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:
-- Create date:
-- Description:
-- =============================================
CREATE PROCEDURE UsuarioUdp(
	-- Parametros del SP
@Nombre varchar(50),
@Paterno varchar(50),
@Materno varchar(50),
@Correo varchar(100),
@Password varchar (20)
)
AS
BEGIN
	-- SET NOCOUNT ON se añade para prevenir resultados extras
	-- que interfieran con los elementos de un select.
	SET NOCOUNT ON;
    -- Insertamos el procedimiento aqui.
    UPDATE Usuario SET Nombre=@Nombre,Paterno=@Paterno,Materno=@Materno WHERE Correo=@Correo AND Passwd=@Password
END
GO

Después Utilizaremos el WebService que ya teníamos,  y lo modificaremos un poco para que haga llamadas a un proyecto de DataAccess en esta ocasión no veremos nada acerca de un BussinesLogic.

Comenzaremos  agregando un nuevo proyecto a nuestra solución, llamada DataAccess este proyecto, será un proyecto de tipo ClassLibrary como lo vemos acontinuación:

Agregando Class Library

Agregando Class Library

Después agregamos las referencias para que se WebService pueda ver al DataAccess:

Añandiendo Referencias

Añandiendo Referencias

Procederemos a agregar las librerias del Enterprise Library como se vio en el post anterior ver aquí.

Crearemos una carpeta llamada clases en la cual agregaremos las siguientes clases que tienen que ver con la información que obtendremos en la base de datos y son las siguientes:

Clase Respuesta:

namespace wsEjemplo
{
public class Respuesta
{
public bool Ok { get; set; }
public string Mensaje { get; set; }
}
}

La clase respuesta la utilizo para mandar mensajes codificados y tomar deciciones en el programa dentro del Webservice, me puede decir un error y me devuelve un true o false, dependiendo si se realiza o no la operación.

Clase Usuario:

namespace wsEjemplo
{
public class Usuario
{
public int UsuarioId { get; set; }
public string Nombre { get; set; }
public string Paterno { get; set; }
public string Materno { get; set; }
public string Correo { get; set; }
public string Passwd { get;set; }
}
}

Continuaremos agregando una clase llamada UsuarioDAL, para identificarlo y después se crearán métodos estáticos descriptivos para mandar a llamar desde el WebService:

<strong>Metodo para ObtenerUsuarios:</strong>

public static List ObtenerUsuarios()
{
List lstUsuarios = new List();
DataTable dt = new DataTable();
Database db = DatabaseFactory.CreateDatabase("ConeccionPrueba");
DbCommand cmd = db.GetStoredProcCommand("UsuariosSel");
cmd.CommandTimeout = 600;
dt = db.ExecuteDataSet(cmd).Tables[0];
if (dt.Rows.Count > 0)
{
foreach (DataRow itemUsuario in dt.Rows)
{
lstUsuarios.Add(
new Usuario
{
UsuarioId = Convert.ToInt32(itemUsuario["UsuarioId"].ToString()),
Nombre = itemUsuario["Nombre"].ToString(),
Paterno = itemUsuario["Paterno"].ToString(),
Materno = itemUsuario["Materno"].ToString(),
Correo = itemUsuario["Correo"].ToString(),
Passwd = ""
}
);
}
}
return lstUsuarios;
}

Metodo para Obtener un usuario:

public static Usuario ObtenerUsuario(Usuario usuario)
{
DataTable dt = new DataTable();
Database db = DatabaseFactory.CreateDatabase("ConeccionPrueba");
DbCommand cmd = db.GetStoredProcCommand("UsuarioSel");
db.AddInParameter(cmd, "@Correo", DbType.String, usuario.Correo);
db.AddInParameter(cmd, "@Password", DbType.String, usuario.Passwd);
cmd.CommandTimeout = 600;
dt = db.ExecuteDataSet(cmd).Tables[0];
if (dt.Rows.Count > 0)
{
usuario.UsuarioId = Convert.ToInt32(dt.Rows[0]["UsuarioId"].ToString());
usuario.Nombre = dt.Rows[0]["Nombre"].ToString();
usuario.Paterno = dt.Rows[0]["Paterno"].ToString();
usuario.Materno = dt.Rows[0]["Materno"].ToString();
}
return usuario;
}

Metodo para agregar un usuario:

public static Respuesta AgregarUsuario(Usuario usuario)
{
Respuesta resp = new Respuesta();
DataTable dt = new DataTable();
Database db = DatabaseFactory.CreateDatabase("ConeccionPrueba");
DbCommand cmd = db.GetStoredProcCommand("UsuarioIns");
db.AddInParameter(cmd, "@Nombre", DbType.String, usuario.Nombre);
db.AddInParameter(cmd, "@Paterno", DbType.String, usuario.Paterno);
db.AddInParameter(cmd, "@Materno", DbType.String, usuario.Materno);
db.AddInParameter(cmd, "@Correo", DbType.String, usuario.Correo);
db.AddInParameter(cmd, "@Password", DbType.String, usuario.Passwd);
cmd.CommandTimeout = 600;
try
{
db.ExecuteNonQuery(cmd);
resp.Ok = true;
}
catch (Exception ex)
{
resp.Ok = false;
resp.Mensaje = ex.Message;
}
return resp;
}

Metodo para Modificar un Usuario:

public static Respuesta ModificarUsuario(Usuario usuario)
{
Respuesta resp = new Respuesta();
DataTable dt = new DataTable();
Database db = DatabaseFactory.CreateDatabase("ConeccionPrueba");
DbCommand cmd = db.GetStoredProcCommand("UsuarioUdp");
db.AddInParameter(cmd, "@Nombre", DbType.String, usuario.Nombre);
db.AddInParameter(cmd, "@Paterno", DbType.String, usuario.Paterno);
db.AddInParameter(cmd, "@Materno", DbType.String, usuario.Materno);
db.AddInParameter(cmd, "@Correo", DbType.String, usuario.Correo);
cmd.CommandTimeout = 600;
try
{
db.ExecuteNonQuery(cmd);
resp.Ok = true;
}
catch (Exception ex)
{
resp.Ok = false;
resp.Mensaje = ex.Message;
}
return resp;
}

Una vez terminado esto, podemos tener un proyecto de 2 capas, en este caso una capa de datos y una capa de WS las cuales se comunican de una manera muy simple.

Este método de manejo del Enterprise Library puede ser usado directamente en cualquier aplicación para generar una aplicación de dos capas y no de 3 como lo estamos haciendo en el caso del WebService creo que por el momento es todo, dejaré el ejemplo para que lo evalúen y puedan jugar un poco con el como siempre, al final se verá algo como esto:

WebService

WebService

Para la siguiente entrega consumiremos este WebService desde Una Aplicación de Escritorio y desde una aplicación Web

Descargar

Anuncios

Configurando el Entreprise Library en VS2008


Para utilizar el Enterprise Library, comenzaremos por descargarlo e instalarlo de aquí. Despues de instalarlo abriremos el Visual Studio y agregaremos las Referencias que se pueden ver en la siguiente Imagen:

Referencias de Enterpise Library

Referencias de Enterpise Library

Una vez agregadas esas referencias iremos directamente a la zona de configuración en el Web.Config en el Caso de Paginas Web en el caso de aplicaciones aun sean consola utilizaremos el app.config.

Configurando Enterprise Library

Configurando Enterprise Library

Mostrando la información, daremos click en Edid Enterprise Library Configuration y nos mostrará la siguiente pantalla.
Pantalla de Información

Pantalla de Información

Bien, aprobecharemos para cambiar el nombre a ConeccionPrueba para ejemplificar nuestra conexión de prueba, además daremos click en los 3 puntitos que aparecen en el lado derecho en ConnectionString y nos mostrará la siguiente pantalla:
Conexión de Enterprise Library

Conexión de Enterprise Library

Pondremos el nombre o IP del servidor y el tipo de Autenticación que utilizaremos, luego solo es cuestion de escoger la Base de datos y listo tenemos una configuración limpia de SQLServer, ahora solo resta crear un Proyecto de DataAccess para crear las llamadas a los procedimientos al macenados.
Por hoy es todo nos veremos en la proxima entrega agregando un proyecto de DataAccess a nuestro web service, recordemos que el uso puede ser en Web y en WebServices.

Comando ln


Ok acabo de tener un problema con el viejo servidor virtual… por que el mysql del repositorio de ubuntu no puso los archivos /etc/my.cnf y /etc/init.d/mysqld si, quise acceder todo el sistema para administrarlo con el Workbench obvio me pide un servidor ssh una vez conectado sobre el ssh me dice que busca esos archivos los cuales no existen y pues sali corriendo para crear enlaces simbólicos e aquí los 3 tipos que existen:

  • Enlaces duros son los que cuando se borra este también se elimina el fichero al que apunta.
  • Enlaces suaves son los lo contrario de los duros. Son algo así como el equivalente de los accesos directos de Windows. Cuando son eliminados el fichero queda intacto.
  • Enlaces relativos son como los enlaces de una página que apuntan a partes de ella.

Para solucionar el pequeño problema utilice enlaces suaves pero pondré un ejemplo de cada uno

Para enlaces duros con ln /etc/mysql/my.cnf /etc/my.cnf y ln /etc/init.d/mysql /etc/init.d/mysqld nos permitiría crear un enlace duro.

Para crear un enlace suave lo haríamos de la siguiente manera ln -s /etc/mysql/my.cnf /etc/my.cnf y ln -s /etc/init.d/mysql /etc/init.d/mysqld

Desgraciadamente no tengo ejemplo para el enlace relativo pero dejo la serie de opciones que encontré en el comando man

Opciones:

Los argumentos obligatorios para las opciones largas son también obligatorios para las opciones cortas.

–backup[=CONTROL] crea una copia de seguridad de cada fichero de destino que ya exista

-b como –backup pero no acepta ningún argumento

-d, -F, –directory permite al superusuario intentar crear un enlace duro entre directorios (note: puede que falle por restricciones del sistema, incluso para el superusuario)

-f, –force borra los ficheros destino que ya existan

-n, –no-dereference trata un destino que sea un enlace simbólico a un directorio como si fuera un fichero normal

-i, –interactive pregunta si se borran los destinos

-s, –symbolic crea enlaces simbólicos en vez de enlaces duros

-S, –suffix=SUFIJO reemplaza el sufijo de respaldo habitual

-t, –target-directory=DIRECTORIO especifica el DIRECTORIO en el que se crearán los enlaces

-T, –no-target-directory trata al LINK_NAME como un archivo normal

-v, –verbose detallada del nombre de cada archivo enlazado

–help muestra esta ayuda y finaliza

–version informa de la versión y finaliza

A %d blogueros les gusta esto: