Guía de Desarrollo de Aplicaciones C# .NET y MySQL Sorey Bibiana García Zapata http://soreygarcia.blogspot.com
Requisitos de conocimiento: Para iniciar este curso usted debe conocer sentencias básicas de C# .NET y
poseer conceptos básicos de bases de datos. Además se requiere tener la contextualización necesaria en aplicaciones distribuidas dada en la presentación http://www.slideshare.net/soreygarcia/aplicacionesdistribuidas-presentation Requisitos técnicos: Tener instalado Visual Studio .NET 2005.
1. Construyendo la base del proyecto proyecto Suponga el siguiente Diagrama de Paquetes:
De acuerdo a la teoría vista debemos crear los componentes representados en este Diagrama de Paquetes, teniendo en cuenta que: Ejercicio.Escritorio es una Aplicación WinForms Ejercicio.LogicaNegocio es una Librería de Clases Ejercicio.ObjetosNegocio es una Librería de Clases Ejercicio.AccesoDatos es una Librería de Clases Ejercicio.ServicioWeb es un WebService ASP.NET Ejercicio.Web es un Sitio Web ASP.NET
v ías de comunicación entre componentes, solo los Recuerde: Este diagrama nos definirá las vías componentes relacionados entre sí pueden comunicarse, la dirección de la línea indicará que proyecto usa a cual proyecto, proy ecto, por ejemplo Ejercicio.Escritorio usa las clases del paquete Ejercicio.ObjetosNegocio. Es importante que tenga en cuenta que esta relación no es Bireccional, por lo cual Ejercicio.ObjetosNegocio no ve las clases de Ejercicio.Escritorio.
Ahora bien, procesamos a su creación sobre Visual Studio .NET 2005 con C# .NET.
Instrucciones 1. Abra el Visual Studio .NET 2005
Recuerde que en Windows Vista usted debe ejecutar el Visual Studio en modo administrador para que funcione correctamente.
2. Cree un nuevo proyecto
3. Cerciórese de que el Lenguaje C# se encuentra seleccionado y elija una Aplicación WinForms.
Recuerde: Este es el primer proyecto (Paquete, Componente) y con él se crean la solución que a agrupará los demás proyectos, por lo que es importante que verifique muy bien en como asigna el nombre de la solución y que deja seleccionada la opción de crear directorio para la solución.
4. Al presionar el botón
usted verá lo siguiente.
Esta imagen muestra la Jerarquía Jerarquía de la Solución. La raíz es “ Ejercicio” y su primer proyecto proyecto es “Ejercicio.Escritorio”. Este proyecto nos muestra la clase Program.cs a través de la cual se indica
cual es la primera ventana que de ejecutará en el proyecto así:
Repasando un poco los conceptos básicos lo que vemos en este archivo es: La referencia a las los namespaces contenidos en las librerías que usa el archivo Program.cs
La declaración del namespace Ejercicio.Escritorio
Recuerde: Los namespace son agrupaciones lógicas de las clases.
La declaración de la clase Program, contenida en el namespace Ejercicio.Escritorio
La declaración del punto de entrada del proyecto Ejercicio.Escritorio, como método de la clase Program.
Recuerde: Un proyecto solo puede tener un solo punto de entrada. El punto de entrada de un proyecto tipo ejecutable (Consola o Winforms) siempre será un método llamado Main.
En la siguiente línea Se indica cual es la forma que iniciará la aplicación en este caso es Form1. 5. Ahora crearemos el proyecto de Lógica de Negocio. Damos click derecho sobre la solución en el Explorador de soluciones y agregamos un nuevo proyecto.
6. Elegimos
el
tipo
Class
Library
(Librería
Ejercicio.LogicaNegocio y presionamos el botón
de
le
Clases),
asignamos
el
nombre
.
Hagalo usted mismo! Agregue los demás proyectos tipo Librería de Clases, Ejercicio.ObjetosNegocio y Ejercicio.AccesoDatos.
7. Si a realizado correctamente el paso anterior, en el Solution Explorer (Explorador de Soluciones) verá el siguiente árbol.
8. Del mismo modo en que se agregaron las Librerías de Clase agregaremos un nuevo proyecto para la aplicación web, Ejercicio.Web. Esta vez seleccionaremos el tipo de proyecto ASP.NET Web Application.
9. Agregamos el proyecto para el servicio web Ejercicio.ServicioWeb, seleccionando esta vez el tipo de proyecto ASP.NET Web Service Application.
10. Para completar las instrucciones que da el diagrama de paquetes, debemos agregar las relaciones entre los proyectos, es decir las referencias. Veamos nuevamente el diagrama de paquetes.
11. El proyecto Ejercicio.Escritorio tiene una referencia al proyecto Ejercicio.ObjetosNegocio. Para añadirla hacemos click derecho sobre la carpeta de referencias del proyecto que tiene la referencia es decir Ejercicio.Escritorio, y seleccione la opción añadir una referencia:
12. En la nueva ventana que aparece seleccionamos el tab Projects (Proyectos) y elegimos el proyecto que se va a referenciar, es decir Ejercicio.ObjetosNegocio y presionamos el botón .
13. Este tipo de referencias se agregan cuando necesitamos que un proyecto de cualquier tipo pueda usar las clases contenidas en un proyecto de tipo Librería de Clases. Sin embargo para que los proyectos Ejercicio.Escritorio y Ejercicio.Web puedan referenciar al proyecto Ejercicio.ServicioWeb se deben seguir los siguientes pasos. 14. De click derecho sobre la carpeta de referencias de alguno de los proyectos que referenciará al servicio web y seleccione la opción agregar una referencia web.
15. En la nueva pantalla que aparece seleccione la o pción servicios web en esta solución.
Recuerde: Esta instrucción se sigue solo cuando estamos desarrollando locamente. Cuando un proyecto de esta naturaleza es implementado en un ambiente de producción debe indicarse la ruta donde se encuentra publicado el servicio web.
16. Después se verán los servicios web contenidos dentro del pr oyecto.
17. En nuestro caso tenemos Service1 que es el que el proyecto crea por defecto al ser añadido a la solución, a modo de ejercicio, continuaremos con la creación de la referencia. Damos click al nombre del servicio Service1 y veremos como carga muestra los métodos que contiene, en nuestro caso es el método por defecto HelloWorld.
18. Cambiamos el nombre localhost del campo nombre de referencia web (Web reference name) y allí colocamos el nombre de la referencia. Por el momento usaremos el nombre Ejercicio.ReferenciaWeb, después de ingresarlo presionamos el botón
.
19. Cuando la referencia se agrega en el explorador de soluciones podemos observar como se ha agregado una carpeta de referencias web que contiene dentro lo que llamaremos un Proxy, con el nombre que indicamos a la referencia web.
Hagalo usted mismo! Agregue las referencias y referencias web que hacen falta para completar el diagrama de paquetes.
2. Construyendo el acceso a datos Usaremos para nuestro ejercicio una base de datos sobre MySQL, por lo cual debemos descargar los siguientes componentes e instalarlos. Servidor de Base de Datos de MySQL 6.0 http://dev.mysql.com/get/Downloads/MySQL-6.0/mysql-6.0.10-alpha-win32.msi/from/pick Conector .NET para MySQL http://dev.mysql.com/get/Downloads/Connector-Net/mysql-connector-net-5.0.9.exe/from/pick Herramientas Graficas para Administración de la Base de Datos MySQL http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-gui-tools-5.0-r17-win32.msi/from/pick
Importante: Debe registrarse para poder realizar estas descargas.
Cuando haya realizado las descargas realice las instalaciones. Importante: Cuando esta instalando el Servidor de Base de Datos, se le solicitará una contraseña para el usuario administrador. Ingrese la contraseña deseada y NO NO LA OLVIDE.
Reinicie el Visual Studio 2005 después de la instalación del Conector .NET para MySQL, para que pueda añadir las referencias correctamente. Después de que todos los instaladores sean ejecutados exitosamente, inicie el programa que permite la administración de las bases de datos de MySQL.
Cuando el programa se inicia solicita los datos para conectar al servidor, ingrese los que se indican a continuación acompañados de la contraseña que ha configurado durante la instalación y presione el botón
.
Al ingresar en la aplicación seleccione la opción Catalogs y de click derecho sobre la lista que aparece en la parte inferior, seleccionando la opción Crear Nuevo Esquema (Create new schema).
Cuando la aplicación se lo solicite ingrese el nombre del esquema o base de datos nueva.
El nuevo esquema aparece en la lista de catalogos. De click derecho sobre el nombre del nuevo esquema creado y seleccione la opción Crear Nueva Tabla (Create New Table).
Cree la tabla tblUsuario siguiendo la imagen que se presenta a continuación y al terminar oprima el botón
.
La aplicación nos solicitará que confirmemos la creación de la tabla, allí oprimimos el botón y luego el botón
.
Verificamos que la tabla ha sido creada.
Ahora bien, lo importante en el desarrollo por capas es delegar responsabilidades responsabilidades a cada c ada una de las capas, componentes y clases que hacen parte del sistema. A partir de este momento construiremos el componente encargado de conectarse a la base de datos y manipular los datos. El proyecto encargado de estas responsabilidades es Ejercicio.AccesoDatos. Empezaremos por borrar la cl ase por defecto que tiene el proyecto.
Cuando se nos pida confirmación presionamos el botón
Ahora agregaremos un nuevo elemento
Este nuevo ítem, será de tipo Class (Clase) y lo llamaremos AccesoDatos.
.
Debe tenerse en cuenta que la extensión .cs, debe conservarse. Ahora bien, de la misma forma añadiremos otra Clase llamada ManejoDatos.cs. Al terminar el proyecto Ejercicio.AccesoDatos debe verse de la siguiente forma.
La clase AccesoDatos tendrá la responsabilidad de hacer métodos genéricos para acceder a la base de datos, tales como: Conectarse, Desconectarse, Ejecutar Operaciones, Consultar Datos. Para que esto sea posible debemos añadir una referencia en el proyecto Ejercicio.AccesoDatos del conector de .NET para MySQL.
En el tab NET buscamos MySql.Data y presionamos el botón
.
Revisamos que en efecto la referencia fue agregada a la car peta de referencias del proyecto
A continuación agregamos a la clase AccesoDatos un objeto de tipo Conexión del esquema de ADO.NET que implementa el Conector .NET de MySQL
Vemos como aparece una linea vinotinto bajo el objeto conexión debido a que aun el archivo donde esta la clase AccesoDatos, Acc esoDatos, no conoce el namespace donde este se encuentra. Presionamos la linea y seleccionamos el namespace al que pertenece.
Al seleccionarlo el using correspondiente se ubica en la parte superior del archivo y el nombre de la clase que corresponde al tipo del objeto conexión, se muestra en color verde claro.
Luego de esto, declaramos el constructor de la clase, así
Recordamos que el constructor tiene el mismo nombre de la clase y no tiene parámetro de retorno, además le agregamos un parámetro de entrada a través del cual configuraremos luego la cadena de conexión a la base de datos.
Además, en el constructor inicializamos el objeto conexión configurándolo con la cadena de conexión que se recibirá como parámetro. Las cadenas de conexión para cualquier base de datos la podemos encontrar en la página http://www.connectionstrings.com/ Ahora vamos a declarar dentro de la clase y debajo del constructor, el método conectar.
Debemos recordar colocar la conexión dentro de un bloque try… catch con el fin de poder controlar si un error ocurre al momento de conectarse a la base de datos. Recordamos además que la expresión throw nos sirve para relanzar la excepción. Ahora declaramos el método desconectar.
Para desconectarnos, cerramos la conexión y destruimos el objeto conexión. Declaramos el método Consultar que nos va a retornar un DataTable
Como el DataTable no se encuentra referenciado nuevamente saldrá la linea vinotinto que ya sabemos como usar. El método consultar debe tener la siguiente estructura, para ejecutar sentencias de tipo consulta que no tengan parámetros.
Podemos agregar una sobre carga para ejecutar consultas que tengan parámetros así.
Ahora declaramos el método necesario para ejecutar operaciones (insertar, actualizar y borrar) sin parámetros.
Y añadimos la sobrecarga que podrá ejecutar sentencias de modificación de datos, con parámetros.
Cuando todos los métodos estén listos, si los minimizamos, la clase debería quedar de la siguiente manera.
Es importante que se establezca esta clase como interna, para que no pueda ser accedida desde fuera del proyecto, ya que solo so lo la clase ManejoDatos puede conocerla. Ahora crearemos la c lase ManejoDatos, esta clase tendrá la responsabilidad r esponsabilidad de saber que sentencias sql o procedimientos de la base de datos deben ejecutarse para poder realizar una función específica. ejec utar instrucciones que lleven parametros debemos usar Importante: Con MySQL para ejecutar procedimientos almacenados. Crearemos un procedimiento con parámetros que haga una consulta en la base de datos de una combinación de usuario y contraseña. Seleccionamos el esquema y elegimos el tab procedimientos almacenados (Stored procedures) y precionamos el botón
.
La aplicación nos solicitará el nombre del procedimiento almacenado, escribimos el nombre spConsultarCredecialesUsuario spConsultarCredecialesUsu ario y presionamos el botón
.
A continuación aparecerá una ventana en la cual se creará el procedimiento almacenado.
Dentro del bloque de BEGIN y END escribimos la instrucción a ejecutarse y en los paréntesis del nombre del procedimiento configuramos los parámetros de entrada y presionamos el botón
Verificamos que el procedimiento fue creado exitosamente.
La clase ManejoDatos debe ser publica para que sea accedida desde otros proyectos. Dentro de ella debemos declarar un atributo string para la cadena de conexión que sea privado y un constructor que reciba el valor de dicha cadena. Ademas declararemos un método que ejecute el procedimiento que acabamos de crear.
.
Recuerde: Las clases DataTable y MySqlParameter no aparecerán en verde claro hasta que no use la linea vinotinto que le indica cuales son los namespaces a usar o bien hasta que los escriba manualmente si los conoce.
Con el fin de ver la diferencia entre una consulta y una operación de modificación de datos añadiremos dentro de la clase ManejoDatos un método encargado de insertar un registro nuevo en la tabla que tenemos creada. El código del procedimiento procedimiento es el siguiente:
El procedimiento almacenado que debe crear es el que sigue:
3. Construyendo la lógica de negocios negocios Ahora que el acceso a datos está construido, debemos construir secuencialmente las otras capas hasta llegar a la interfaz de usuario. Construyamos ahora la lógica de negocio. Vamos al proyecto Escritorio.LogicaNegocio y borramos la clase por defecto Class1.cs.
Luego añadimos una nueva clase en el proyecto que se llame Operaciones. El árbol del proyecto debe quedar como se ve a continuación.
Recuerde que previamente en la parte uno de esta guía ustede debió añadir la referencia de Ejercicio.LogicaNegocio a Ejercicio.AccesoDatos como lo indicaba el D iagrama de Paquetes. Ahora bien, haga que la clase Operaciones sea pública y cree las firmas de los métodos que se indican a continuación
El método IniciarSesion se encargará de validas si un usuario puede entrar o no al sistema. El método InsertarUsuario se encargará de registrar un usuario nuevo en la base de datos. Ahora añadamos un atributo tipo string privado para la cadena de conexión, y agreguemos el constructor a través del cual se inicializará.
Ahora completamos los dos métodos para la ejecución de las operaciones. En la parte superior del archivo agregamos el using a el proyecto Ejercicio.AccesoDatos.
Dentro del método InsertarRegistro hacemos una instancia de la clase ManejoDatos. Cuando llegamos al constructor podemos observar como este nos pide entregarle la cadena de conexión.
Completamos el procedimiento como sigue a continuacion
Recuerde que el bloque try nos ayuda a controlar errores en la ejecución, observe ademas que en este caso el throw lanza una nueva excepcion indicando el mensaje y adjuntando la excepcion que pudiera venir desde la base datos. Para implementar el método IniciarSesión en c ambio, no haremos una invocación sencilla. Primero consultaremos y luego verificaremos si la c onsulta obtuvo resultados, lo que significará que las credenciales del usuario eran correctas. Recuerde colocar el namespaces que hagan falta usando la barra vinotinto para la barra vinotinto para la clase DataTable. El procedimiento debe quedar como sigue
Así ha quedado implementada la librería de clases de la lógica de negocio. Ahora bien, aun la interfaz de usuario no puede acceder a estos métodos, debido a que de acuerdo al Diagrama de Paquetes incial es el servicio web quien accede a estos datos. Vamos entonces a configurar el servicio web. Recuerde que el servicio web actua simplemente como una capa de transporte entre la interfaz de usuario y la logica de negocio. Lo que per mite un servicio web es que la lógica de negocios sea accedida a traves de internet. En primer lugar vamos a usar el archivo web.config que es un archivo de configuración del web service para configurar la cadena de conexión a la base de datos. Este archivo se encuentra dentro del proyecto de tipo servicio web
Dando doble click al web.config w eb.config se ve lo siguiente:
Buscamos en la página sugerida el string de conexión adecuado para mysql http://www.connectionstrings.com/mysql En nuestro caso sería
Vamos al web.config y lo configuramos así
Estos por supuestos son mis datos de configuración, usted deberá cambiar el password por el que ha configurado al instalar MySQL. Ahora vamos a borrar el servicio que hay creado por defecto en el proyecto, asi.
Luego añadimos un nuevo ítem
Elegimos el tipo WebService y le damos por nombre LogicaNegocio.
Recuerde conservar la extensión .asmx. Si ha hecho todo bien hasta aquí, el árbol debe verse de la siguiente forma
Recuerde que debió agregar previamente una referencia a Ejercicio.LogicaNegocio en la primera sección de esta guía. Ahora bien, en la pantalla usted debe estar visualizando el siguiente código.
Este código pertenece al web service que acabamos de agregar, usted debe tener en cuenta algo básico. Cuando ubica el tag
sobre la cabecera de un método, ese método queda expuesto en el
web service de otra manera no podrá dicho método ser accedido de forma remota. Probaremos quitándole el atributo a el método por defecto y creando c reando nuestros propios métodos. Cree dos métodos con las mismas firmas del proyecto Ejercicio.LogicaNegocio.
Desde cada uno de estos métodos se invocará a la clase operaciones enviadole la cadena de conexión que hay almacenada en el web config.
Recuerde usar la linea vinotinto para incluir los namespaces correspondientes a las clases Operaciones y ConfigurationManager.
4. Construyendo la interfaz de usuario usuario En este punto todas las capas están configuradas, necesitamos crear entonces las pantallas a través de las cuales el usuario interactuará con el sistema, primero crearemos una pantalla de inicio de sesión. Primero borramos la forma que hay creada por defecto
Luego añadimos un nuevo ítem
Seleccionamos el tipo WindowsForms y le colocamos el nombre frmInicioSesion.
En la pantalla nos aparece una nueva forma en blanco asi
Agregamos los controles a la forma para que se vea de la siguiente manera
Recuerde el nombramiento correcto de los controles Botones: btnIniciar, btnRegistrarse Labels: lblUsuario, lblClave Textbox: txtUsuario, txtClave
Ahora bien, debemos eliminar la referencia web que habíamos construido en la primera parte de la guía.
Ahora añadiremos una nueva al servicio web que hemos creado
Vemos como al momento de explorar las soluciones del proyecto ya no vemos Service1 si no que vemos LogicaNegocio que es el nombre que le pusimos a nuestro servicio web.
Y al darle click vemos que aparecen nuestros métodos pero no aparece el HelloWorld por que no le quitamos el atributo que lo exponía
Configuramos el nombre y añadimos la referencia
El árbol del proyecto debe ver asi
Ahora vamos a la forma y damos doble click sobre el botón iniciar. Aparecerá el siguiente código
Invocaremos el método iniciar sesión dentro del click del botón asi
Es importante que se usen los bloques try … catch en la interfaz de usuario para que cuando ocurra un error la aplicación no se detenga, sin embargo observe que en este caso ya no relanzamos la excepción con un throw si no que exponemos el mensaje enviado por la excepción. En este momento podemos probar la aplicación. Primero debemos establecer la forma frmInicioSesion como la que se va ejecutar primero en el punto de entrada
Cerciórese ademas de que tiene el proyecto Ejercicio.Escritorio como proyecto de inicio, si no establézcalo.
Presione el botón ejecutar
ubicado en la barra superior.
Debido a que aun no tenemos ningún usuario en la base de datos, solo veremos lo siguiente
Ahora configuremos el botón Registrarse.
Ahora podemos probar ambos botones, primero registramos un usuario.
Y luego oprimimos el botón iniciar sesión.