Download - MVC y Programacion Por Capas
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
Este tutorial expone de manera sencilla paso a paso la administración de una aplicación usando MVC, el paradigma Model View Controller basándose en tres capas: Presentación, Aplicación y Datos.
Gestiono lo básico de una interface MDI ya que tutoriales de ventanitas y controles hay hasta por gusto, quise exponer la arquitectura de una aplicación basada en los paradigmas mencionados como es implementar la lógica de programación en la Base de Datos usando Procedimientos almacenados y administrar esta lógica desde la aplicación.
Se cumple con el principio de independecia si es que se programa en la Base de Datos y no en la aplicación, la aplicación es una simple interface o medio de comunicación entre el usuario y la base de datos, evítandonos así el recompilar la aplicación y permitiéndonos en su lugar focalizarnos en la programación en la misma Base de Datos sin tener que cambiar la aplicación.
La idea de este tutorial es la de brindar al programador de software libre un conocimiento clave para que cuando encuentre este paradigma basado en plataformas .NET en alguna organización pueda entenderla y migrarla al software libre.
Como mencioné me he centrado en la arquitectura de la aplicación, la implementación de controles bonitos es un trabajo que particularmente no pienso hacer, para eso existen miles de tutoriales en la red.
Programar usando MVC y CAPAS no es algo que se encuentre a diario, yo mismo sufrí para implementar este tutorial, la parte difícil por decirlo así está aquí, la arquitectura, lo demás que es una simple cuestión de diseño lo conoce cualquiera.
Este es mi último tutorial en plataformas privativas y lo hago sólo por dotar de conocimiento sencillo a aquellos amigos que quieran entender las arquitecturas .NET en las empresas y puedan luego migrarlas al software libre.
Ahora mi pasión son la programación competitiva y el Software libre, el hecho que uno cultive Software Libre no implica que uno no sea experto en otras plataformas (Soy Desarrollador 5 estrellas Platino DCE 2005), precisamente la comprensión de esta plataforma me llevó a querer y a amar el software libre.
El Autor
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
ADMINISTRAR UNA BASE DE DATOS UTILIZANDO MVC (Model View Controller) y PROGRAMACIÓN POR CAPAS
SOFTWARE NECESARIO:
SQL SERVER 2008 O 2005 Express que se instala por defecto con el Visual Studio.
Si este es tu caso el Administrador de SQL 2008 lo puedes descargar de aquí:
http://www.microsoft.com/download/en/details.aspx?id=22985
Si usas el SQL Express 2005 el administrador lo puedes descargar de aquí:
http://www.microsoft.com/downloads/es-es/details.aspx?FamilyID=C243A5AE-4BD1-4E3D-94B8-5A0F62BF7796
Cualquier otra versión de SQL SERVER 2008 O 2005 (Ya viene con la interface de administración).
VISUAL STUDIO 2010 O 2008
CONOCIMIENTOS:
ADO .NET BÁSICO
SQL SERVER BÁSICO
T – SQL BÁSICO
VISUAL BASIC .NET BÁSICO
FUENTES:
El código Fuente de la aplicación desarrollada en este tutorial lo puedes descargar de aquí:
https://docs.google.com/open?id=0B_H9bnl3ECg6T3hSSmVmeEJTNGFHZ3RhTkUwUjhCQQ
El BackUp de la Base de Datos lo puedes encontrar aquí:
https://docs.google.com/open?id=0B_H9bnl3ECg6T1ZlMVpWZTZSWWFPZWRjZzV1LUxjUQ
Arquitectura de ADO.NET
Tradicionalmente, el procesamiento de datos ha dependido principalmente de un modelo de dos niveles basado en una conexión. A medida que el procesamiento de
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
datos utiliza cada vez más arquitecturas de varios niveles, los programadores están pasando a un enfoque sin conexión con el fin de proporcionar una escalabilidad mejor para sus aplicaciones.
Componentes de ADO.NETExisten dos componentes de ADO.NET que se pueden utilizar para obtener acceso a datos y manipularlos:
Proveedores de datos de .NET FrameworkEl DataSet
Proveedores de datos de .NET FrameworkLos proveedores de datos de .NET Framework son componentes diseñados explícitamente para la manipulación de datos y el acceso rápido a datos de sólo lectura y sólo avance. El objeto Connection proporciona conectividad a un origen de datos. El objeto Command permite tener acceso a comandos de base de datos para devolver datos, modificar datos, ejecutar procedimientos almacenados y enviar o recuperar información sobre parámetros. El objetoDataReader proporciona una secuencia de datos de alto rendimiento desde el origen de datos. Por último, el objetoDataAdapter proporciona el puente entre el objeto DataSet y el origen de datos. El DataAdapter utiliza objetosCommand para ejecutar comandos SQL en el origen de datos tanto para cargar el DataSet con datos como para reconciliar en el origen de datos los cambios aplicados a los datos incluidos en el DataSet.
DataSetEl DataSet de ADO.NET está expresamente diseñado para el acceso a datos independientemente del origen de datos. Como resultado, se puede utilizar con múltiples y distintos orígenes de datos, con datos XML o para administrar datos locales de la aplicación. El DataSet contiene una colección de uno o más objetos DataTable formados por filas y columnas de datos, así como información sobre claves principales, claves externas, restricciones y relaciones relativa a los datos incluidos en los objetos DataTable.En el diagrama siguiente se ilustra la relación entre un proveedor de datos de .NET Framework y un DataSet.Arquitectura de ADO.NET
Elegir un DataReader o un DataSetA la hora de decidir si su aplicación debe utilizar un DataReader (vea Recuperar datos mediante DataReader) o unDataSet (vea Utilizar DataSets en ADO.NET), debe tener en cuenta el tipo de funcionalidad que su aplicación requiere. Use un DataSet para hacer lo siguiente:
Almacene datos en la memoria caché de la aplicación para poder manipularlos. Si solamente necesita leer los resultados de una consulta, el DataReader es la mejor elección.Utilizar datos de forma remota entre un nivel y otro o desde un servicio Web XML. Interactuar con datos dinámicamente, por ejemplo para enlazar con un control de formularios Windows Forms o para combinar y relacionar datos procedentes de varios orígenes.Realizar procesamientos exhaustivos de datos sin necesidad de tener una conexión abierta con el origen de datos, lo que libera la conexión para que la utilicen otros clientes.
Si no necesita la funcionalidad proporcionada por el DataSet, puede mejorar el rendimiento de su aplicación si utiliza el DataReader para devolver sus datos de
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
sólo avance y de sólo lectura. Aunque el DataAdapter utiliza el DataReaderpara rellenar el contenido de un DataSet (vea Llenar un DataSet desde un DataAdapter), al utilizar el DataReaderpuede mejorar el rendimiento porque no usará la memoria que utilizaría el DataSet, además de evitar el procesamiento necesario para crear y rellenar el contenido de DataSet.
Modelo Vista Controlador
Un diagrama sencillo que muestra la relación entre el modelo, la vista y el controlador. Nota: las líneas sólidas
indican una asociación directa, y las punteadas una indirecta (por ejemplo, patrón Observer).
Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que separa los datos de
una aplicación, la interfaz de usuario, y la lógica de negocio en tres componentes distintos. El patrón
de llamada y retorno MVC (según CMU), se ve frecuentemente en aplicaciones web, donde la vista
es la página HTML y el código que provee de datos dinámicos a la página. El modelo es el Sistema
de Gestión de Base de Datos y la Lógica de negocio, y el controlador es el responsable de recibir los
eventos de entrada desde la vista.
Contenido
1 Historia
2 Descripción del
patrón
3 Frameworks MVC
4 Véase también
5 Referencias
6 Enlaces externos
Historia
El estilo fue descrito por primera vez en 19791 por Trygve Reenskaug, entonces trabajando
en Smalltalk en laboratorios de investigación deXerox. La implementación original está descrita
en Programación de Aplicaciones en Smalltalk-80(TM): Como utilizar Modelo Vista Controlador.2
Descripción del patrón
Modelo: Esta es la representación específica de la información con la cual el sistema opera.
En resumen, el modelo se limita a lo relativo de la vista y su controlador facilitando las
presentaciones visuales complejas. El sistema también puede operar con más datos no relativos
a la presentación, haciendo uso integrado de otras lógicas de negocio y de datos afines con el
sistema modelado.
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
Vista: Este presenta el modelo en un formato adecuado para interactuar, usualmente
la interfaz de usuario.
Controlador: Este responde a eventos, usualmente acciones del usuario, e invoca
peticiones al modelo y, probablemente, a la vista.
Muchos de los sistemas informáticos utilizan un Sistema de Gestión de Base de Datos para
gestionar los datos: en líneas generales delMVC corresponde al modelo. La unión entre capa de
presentación y capa de negocio conocido en el paradigma de la Programación por
capas representaría la integración entre Vista y su correspondiente Controlador de eventos y
acceso a datos, MVC no pretende discriminar entre capa de negocio y capa de presentación pero si
pretende separar la capa visual gráfica de su correspondiente programación y acceso a datos, algo
que mejora el desarrollo y mantenimiento de la Vista y el Controlador en paralelo, ya que ambos
cumplen ciclos de vida muy distintos entre sí.
Aunque se pueden encontrar diferentes implementaciones de MVC, el flujo que sigue el control
generalmente es el siguiente:
1. El usuario interactúa con la interfaz de usuario de alguna forma (por ejemplo, el
usuario pulsa un botón, enlace, etc.)
2. El controlador recibe (por parte de los objetos de la interfaz-vista) la notificación de
la acción solicitada por el usuario. El controlador gestiona el evento que llega,
frecuentemente a través de un gestor de eventos (handler) o callback.
3. El controlador accede al modelo, actualizándolo, posiblemente modificándolo de
forma adecuada a la acción solicitada por el usuario (por ejemplo, el controlador actualiza
el carro de la compra del usuario). Los controladores complejos están a menudo
estructurados usando un patrón de comando que encapsula las acciones y simplifica su
extensión.
4. El controlador delega a los objetos de la vista la tarea de desplegar la interfaz de
usuario. La vista obtiene sus datos del modelo para generar la interfaz apropiada para el
usuario donde se reflejan los cambios en el modelo (por ejemplo, produce un listado del
contenido del carro de la compra). El modelo no debe tener conocimiento directo sobre la
vista. Sin embargo, se podría utilizar el patrón Observador para proveer cierta indirección
entre el modelo y la vista, permitiendo al modelo notificar a los interesados de cualquier
cambio. Un objeto vista puede registrarse con el modelo y esperar a los cambios, pero aun
así el modelo en sí mismo sigue sin saber nada de la vista. Este uso del
patrón Observador no es posible en las aplicaciones Web puesto que las clases de la vista
están desconectadas del modelo y del controlador. En general el controlador no pasa
objetos de dominio (el modelo) a la vista aunque puede dar la orden a la vista para que se
actualice. Nota: En algunas implementaciones la vista no tiene acceso directo al modelo,
dejando que el controlador envíe los datos del modelo a la vista. Por ejemplo en el MVC
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
usado por Apple en su framework Cocoa. Suele citarse como Modelo-Interface-Control, una
variación del MVC más puro
5. La interfaz de usuario espera nuevas interacciones del usuario, comenzando el
ciclo nuevamente.
A. HABILITANDO EL USUARIO “SA” E INICIO DE SESION CON AUTENTICACIÓN DE SQL SERVER
1. Inicio + Todos los Programas + SQLMicrosoft SQL Server 2008 + SQL Server Management Studio.
2. Anticlick + Ejecutar como administrador
3. Loguearnos con la instancia por defecto. Si usas una versión diferente del SQL Express reemplaza el “.\sqlexpress” por el usuario que definiste a la hora de instalar tu MS SQL.
4. Conocemos la interfaz de Administración del SQL.
5. Buscamos al Administrador (SA).
6. Anticlic + Propiedades
7. Nos ubicamos en la página General.
8. Escribimos la contraseña que vamos a utilizar.
9. Nos ubicamos en la página Estado.
10. Habilitamos el Inicio de Sesión + Aceptar.
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
11. Actualizamos.
12. Vemos que el usuario administrador sa está habilitado.
13. Anticlic + Propiedades.
14. Nos ubicamos en la página Seguridad.
15. Habilitamos “Modo de autenticación de Windows y SQL Server” para poder loguearnos con los usuarios que administramos en nuestro servidor como el usuario “sa”.
16. Clic en Aceptar.
17. Anticlic en la raíz + Reiniciar.
18. Clic en “Sí”.
19. Archivo + Desconectar Explorador de objetos.
20. Estamos Desconectados.
21. Archivo + Conectar Explorador de Objetos.
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
22. Nos logueamos, pero esta vez Escogemos “Autenticación de SQL Server”.
23. Probamos nuestro usuario “sa” que hemos habilitado. Clic en Conectar.
24. Estamos logueados con nuestro usuario “sa”.
B. CREANDO OTRO USUARIO SI DESEAMOS
25. Si quisiéramos crear un nuevo usuario diferente al “sa” basta con hacer anticlic en “Inicios de Sesión”.
26. Elegimos Nuevo Inicio de Sesión.
27. Elegimos el nombre de nuestro usuario por ejemplo “pepito” y repetimos los pasos 7 al 24, sólo que en lugar del usuario “sa” usamos el que hemos creado con su respectiva contraseña.
28. Clic en Nueva Consulta.
C. CREANDO NUESTRA BASE DE DATOS “INSTITUTO”, TABLAS Y DATOS
29. Pegamos el Siguiente Script para ahorrarnos el trabajo de crear la Base de Datos, Tablas e ingresar los datos:
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
--Juan Marcelo Chamorro Avendaño
--E-Mail: [email protected]
--Creando la BAse de Datos Alumnos
CREATE DATABASE Instituto
GO
--Creando la Tabla Alumnos
USE Instituto
GO
CREATE TABLE Alumnos
(CodAlumno char(4) PRIMARY KEY NOT NULL,
Nombre VarChar(50) NOT NULL,
Apellidos VarChar(50) NOT NULL,
Especialidad VarChar(50) NOT NULL,
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
Curso VarChar(50) NOT NULL,
Turno VarChar(50) NOT NULL,
Nota Int NOT NULL)
GO
--Crear Tabla Password
CREATE TABLE Password
(IdCod int PRIMARY KEY NOT NULL,
Nombre VarChar(50) NOT NULL,
Apellidos VarChar(50) NOT NULL,
Usuario VarChar(50) NOT NULL,
Password VarChar(50) NOT NULL,
Cargo VarChar(50) NOT NULL)
GO
--Insertando Registros tabla Alumnos
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
INSERT Alumnos
VALUES('A001','Patricia','Lozano Llalico','Computación','Ofimática','Diurno',15)
INSERT Alumnos
VALUES('A002','Tatiana','Torre Alanya','Secretariado','Ofimática','Vespertino',18)
INSERT Alumnos
VALUES('A003','Romina','Llacza Chamorro','Administración','Diseño','Diurno',5)
INSERT Alumnos
VALUES('A004','Dayana','Quintanilla Villafuerte','Secretariado','Inglés','Noche',13)
INSERT Alumnos
VALUES('A005','Kerly','Mosquera Delgado','Computación','Visual Basic .NET','Diurno',9)
INSERT Alumnos
VALUES('A006','Alondra','León Pariona','Computación','Visual Basic .NET','Diurno',8)
INSERT Alumnos
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
VALUES('A007','Gino','Gilvonio Rivera','Electrónica','Circuitos','Vespertino',16)
INSERT Alumnos
VALUES('A008','Franx','Velito Labra','Electrónica','Circuitos','Noche',12)
INSERT Alumnos
VALUES('A009','Sandro','Gutarra Raimondi','Computación','Ensamblaje','Vespertino',12)
INSERT Alumnos
VALUES('A010','Juan','Sánchez Prado','Computación','Ensamblaje','Diurno',15)
GO
--Insertando Registros tabla Password
INSERT Password
VALUES(1,'Alberth','Pisao Venancio','saquito','simiamor','amo de casa')
INSERT Password
VALUES(2,'Marcelo','Chamorro Avendaño','admin','1234','Administrador')
GO
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
--Crear Procedimientos Almacenados
CREATE PROCEDURE mostrar_todo
as
SELECT * FROM ALUMNOS
GO
CREATE PROCEDURE mostrar_12
as
SELECT CodAlumno,Nombre,Apellidos,Nota FROM ALUMNOS WHERE Nota=12
GO
CREATE PROCEDURE mostrar_secretariado
as
SELECT CodAlumno,Nombre,Apellidos,Curso FROM ALUMNOS WHERE Curso='Secretariado'
GO
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
CREATE PROCEDURE mostrar_g
as
SELECT Nombre,Apellidos FROM ALUMNOS WHERE Apellidos LIKE 'g%'
GO
CREATE PROCEDURE mostrar_6
as
SELECT Nombre,Apellidos FROM ALUMNOS WHERE Apellidos LIKE '______'
GO
CREATE PROCEDURE mostrar_a
as
SELECT Nombre,Apellidos FROM ALUMNOS WHERE Apellidos LIKE '_____a'
GO
CREATE PROCEDURE mostrar_operadores
as
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
SELECT Nombre, Apellidos, Nota FROM ALUMNOS WHERE (Nombre LIKE 'l%') AND (Nota < 11)
GO
CREATE PROCEDURE mostrar_entre
as
SELECT * FROM ALUMNOS WHERE Nota BETWEEN 11 AND 15
GO
CREATE PROCEDURE mostrar_lista
as
SELECT * FROM ALUMNOS WHERE Turno IN ('Noche','Diurno')
GO
--Crear Vistas
CREATE VIEW MOSTRAR_NOTAS
AS
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
SELECT Nombre, Apellidos, Nota FROM Alumnos
GO
--Fin de Script
--Juan Marcelo Chamorro Avendaño
--E-Mail: [email protected]
30. Ejecutar el Script.
31. Nuestro Script está ejecutado y la Base de Datos con la que vamos a trabajar ha sido creada.
32. Actualizar.
33. Al expandir vemos Nuestra Base de Datos “Instituto” creada.
34. Vemos que hay dos tablas que han sido creadas por el script.
35. Anticlic en la tabla Alumnos + Editar las 200 primeras filas.
36. Vemos que el Script ya ha creado todos los datos.
37. Anticlic en la Tabla “Password” + Editar las primeras 200 filas.
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
38. Vemos que el script ya ha creado contenido.
D. CREANDO LAS CAPAS DE PRESENTACIÓN, NEGOCIOS Y DATOS: CREANDO LA CAPA DE PRESENTACIÓN “INSTITUTO”
39. Iniciamos el Visual Studio 2010 en Modo Administrador.
40. Archivo + Nuevo Proyecto.
41. Creamos una Aplicación de Windows Form llamada “Instituto” + Aceptar.
E. CREANDO EL FORMULARIO MDI CONTENEDOR (PADRE)
42. Le damos las siguientes propiedades al Form1.
Propiedad Valor
Text frmMain
WindowState Maximized
IsMdiContain True
43. Le agregamos un Control MenuStrip (Arrastrar o hacer doble clic).
44. La propiedad IsMdiContain con su valor “true” la ha convertido en una ventana contenedora.
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
45. Vamos a agregar la ventana de logueo ahora. Anticlic en la raíz Instituto + Agregar + Windows Forms.
46. Le ponemos de nombre frmLogin.
47. Configuramos el form frmLogin como ventana de inicio. Proyecto + Propiedades de Instituto.
48. Seleccionamos “frmLogin”. Con esto cuando ejecutemos el proyecto la ventana frmLogin será la primera en aparecer.
F. CREANDO LAS CAPAS DE PRESENTACIÓN, NEGOCIOS Y DATOS: CREANDO LA CAPA DE NEGOCIOS “NEGOCIO”
49. Agregar Nuevo Proyecto. Archivo + Agregar + Nuevo Proyecto.
50. Seleccionamos “Biblioteca de Clases”. La llamamos “NEGOCIO” + ACEPTAR.
El Explorador de Soluciones se vería así:
Cambiar el Nombre de la Clase por defecto a “N_Login.vb”, para eso seleccionamos la clase y en Propiedades modificar:
Nombre de Archivo: N_Login.vb
CREANDO LAS CAPAS DE PRESENTACIÓN, NEGOCIOS Y DATOS: CREANDO LA CAPA DE DATOS “DATOS”
51. Se crea una Solución automáticamente. Anticlic en la Solución + Agregar + Nuevo proyecto.
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
Igual que en el paso 50 pero esta vez llamarlo “DATOS”.
Cambiar el Nombre de la Clase por defecto a “D_Login.vb”, para eso seleccionamos la clase y en Propiedades modificar:
Nombre de Archivo: D_Login.vb
52. Finalmente nuestra solución se ve así.
G. CREAMOS EL PROCEDIMIENTO ALMACENADO “login” Que Será Gestionado Desde La Aplicación.
53. Creamos un Procedimiento Almacenado al que vamos a llamar “login”. En el Administrador de SQL elegir “Nueva Consulta”, ahí crearemos el siguiente Procedimiento Almacenado.
CREATE PROCEDURE login
@Usuario VARCHAR(50),
@Password VARCHAR(50),
@Res VARCHAR(40) OUTPUT
AS
BEGIN
DECLARE @NUM AS int
SELECT @NUM = COUNT(*) FROM Password
WHERE
Usuario=@Usuario
IF @NUM=1
BEGIN
SELECT @NUM = COUNT(*) FROM Password
WHERE
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
Password=@Password
IF @NUM=1
BEGIN
SET @Res='Acceso Permitido.'
END
ELSE
BEGIN
SET @Res='Clave Incorrecta.'
END
END
ELSE
BEGIN
SET @Res='Usuario No Existe.'
END
END
GO
54. Ejecutar la Consulta para crear el Procedimiento Almacenado.
55. Si todo ha sido correcto el administrador de SQL nos devuelve el mensaje “Comandos Completados Correctamente”.
H. CREAMOS UN ARCHIVO DE CONFIGURACIÓN “APP.CONFIG” QUE ALMACENARÁ LOS PARÁMETROS DE NUESTRA CADENA DE CONEXIÓN
56. En el Visual Studio Agregaremos un Archivo de configuración conteniendo la Cadena de Conexión a la Base de Datos instituto. Anticlic en “Instituto” + Agregar + Nuevo Elemento.
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
57. En Elementos Comunes Seleccionamos “General” y escogemos “Archivo de Configración”. Dejamos el nombre por defecto “app.config” + Agregar.
58. Dentro de <Configuration> </Configuration> colocamos la configuración de nuestra cadena de conexión usando la propiedad <appSettings>.
<appSettings>
<add key="cn"
value="Server=.\sqlexpress;
DataBase=Instituto;
User=sa;
Password=123456;"
/>
</appSettings>
59. Finalmente Tenemos nuestra solución así:
I. REFERENCIAMOS LAS CAPAS
60. Referenciamos la CAPA NEGOCIO A LA CAPA DATOS. Anticlic en NEGOCIO + Agregar Referencia.
61. Seleccionamos la CAPA DATOS + ACEPTAR.
62. Seleccionamos la Capa de Aplicación “Instituto” + Anticlic + Agregar Referencia. Para referenciarla a la Capa NEGOCIO.
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
63. SELECCIONAMOS LA CAPA NEGOCIO + ACEPTAR.
J. CREAMOS LAS CLASES NECESARIAS EN LAS CAPA DE DATOS Y NEGOCIOS CON SUS MÉTODOS RESPECTIVOS, LAS INTERFACES QUE LAS VAN A GESTIONAR Y LOS PROCEDIMIENTOS ALMACENADOS A SER GESTIONADOS POR LA CAPA DE DATOS
64. Codificar la clase D_Login como se indica:
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Public Class D_Login
Private Function Conexion() As SqlConnection
Dim strConn As String
Dim ConfAppSet As New AppSettingsReader
strConn = CStr(ConfAppSet.GetValue("cn", GetType(String)))
Dim ConexionDB As New SqlConnection(strConn)
ConexionDB.Open()
Return ConexionDB
End Function
Public Function BuscarUsuarioD(ByVal usu As String, ByVal clav As String) As String
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
Dim cmd As New SqlCommand
cmd.CommandText = "login"
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = Conexion()
cmd.Parameters.Add("@Usuario", SqlDbType.VarChar, 50).Value = usu
cmd.Parameters.Add("@Password", SqlDbType.VarChar, 50).Value = clav
cmd.Parameters.Add("@Res", SqlDbType.VarChar, 40).Direction = ParameterDirection.Output
cmd.ExecuteNonQuery()
Return cmd.Parameters("@Res").Value
End Function
End Class
65. Codificar la Clase N_Login como se indica:
Imports DATOS
Public Class N_Login
Public Function BuscaUsuarioN(ByVal usuN As String, ByVal clavN As String) As String
Dim clsLogin As New D_login
Return clsLogin.BuscarUsuarioD(usuN, clavN)
End Function
End Class
66. Diseñar el frmLogin como se indica:
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
67. Agregar el Menú “Mantenimiento” y dentro el SubMenú “Alumnos”.
68. Agregamos nuestro formulario de Mantenimiento “frmAlumnos” dentro de la capa de presentación Instituto.
69. Diseñar como se indica.
70. Dentro del código del formulario frmAlumnos agrego el método constructor Sub New(), una instancia frmInstance y una función Instance() como se ve en el cuadro y la imagen:
Public Class frmAlumnos
Private Sub New()
' Llamada necesaria para el diseñador.
InitializeComponent()
' Agregue cualquier inicialización después de la llamada a InitializeComponent().
End Sub
Private Shared frmInstance As frmAlumnos = Nothing
Public Shared Function Instance() As frmAlumnos
If frmInstance Is Nothing OrElse frmInstance.IsDisposed = True Then
frmInstance = New frmAlumnos
End If
frmInstance.BringToFront()
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
Return frmInstance
End Function
End Class
Con esto logramos que se inicie una sola instancia de nuestro formulario hijo.
71. Doble clic en el submenu Alumnos para generar su código:
72. Agregarle el siguiente código:
Dim Alumnos As frmAlumnos = frmAlumnos.Instance
Alumnos.MdiParent = Me
Alumnos.Show()
73. En el SQL Server Management abrimos una Nueva Consulta y creamos otro procedimiento Almacenado similar al paso 53:
CREATE PROCEDURE listarAlumnos
AS
BEGIN
SELECT * FROM Alumnos
END
GO
74. Ejecutamos la consulta para crear el procedimiento almacenado “listarAlumnos”.
75. Agregamos una nueva clase dentro de la Capa DATOS llamada D_Listar. La codificamos como se indica:
Imports System.Data
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
Imports System.Data.SqlClient
Imports System.Configuration
Public Class D_Listar
Private Function Conexion() As SqlConnection
Dim strConn As String
Dim ConfAppSet As New AppSettingsReader
strConn = CStr(ConfAppSet.GetValue("cn", GetType(String)))
Dim ConexionDB As New SqlConnection(strConn)
ConexionDB.Open()
Return ConexionDB
End Function
Public Function ListarD() As DataSet
Dim cmd As New SqlCommand
cmd.CommandText = "listarAlumnos"
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = Conexion()
Dim DA As New SqlDataAdapter
Dim DS As New DataSet
DA.SelectCommand = cmd
DA.Fill(DS)
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
Return DS
End Function
End Class
76. Agregamos una nueva clase dentro de la capa NEGOCIO llamada N_Listar y la codificamos como se indica:
Imports DATOS
Public Class N_Listar
Public Function ListarN() As DataSet
Dim clsLogin As New D_Listar
Return clsLogin.ListarD
End Function
End Class
77. Creamos el procedimiento almacenado InsertarAlumno:
CREATE PROCEDURE InsertarAlumno
@CodAlumno CHAR(4),
@Nombre VARCHAR(50),
@Apellidos VARCHAR(50),
@Especialidad VARCHAR(50),
@Curso VARCHAR(50),
@Turno VARCHAR(50),
@Nota VARCHAR(50)
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
AS
BEGIN
INSERT INTO Alumnos
VALUES
(
@CodAlumno,
@Nombre,
@Apellidos,
@Especialidad,
@Curso,
@Turno,
@Nota
)
END
GO
78. Renombramos las cajas de texto como se indica en la figura:
79. Agregamos una nueva clase dentro de la capa DATOS llamada D_Insertary la codificamos como se indica:
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Public Class D_Insertar
Private Function Conexion() As SqlConnection
Dim strConn As String
Dim ConfAppSet As New AppSettingsReader
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
strConn = CStr(ConfAppSet.GetValue("cn", GetType(String)))
Dim ConexionDB As New SqlConnection(strConn)
ConexionDB.Open()
Return ConexionDB
End Function
Public Function InsertarD(ByVal CodAlumno As String, ByVal Nombre As String, ByVal Apellidos As String, ByVal Especialidad As String, ByVal Curso As String, ByVal Turno As String, ByVal Nota As Integer) As Integer
Dim cmd As New SqlCommand
cmd.CommandText = "InsertarAlumno"
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = Conexion()
cmd.Parameters.Add("@CodAlumno", SqlDbType.Char, 4).Value = CodAlumno
cmd.Parameters.Add("@Nombre", SqlDbType.VarChar, 50).Value = Nombre
cmd.Parameters.Add("@Apellidos", SqlDbType.VarChar, 50).Value = Apellidos
cmd.Parameters.Add("@Especialidad", SqlDbType.VarChar, 50).Value = Apellidos
cmd.Parameters.Add("@Curso", SqlDbType.VarChar, 50).Value = Curso
cmd.Parameters.Add("@Turno", SqlDbType.VarChar, 50).Value = Turno
cmd.Parameters.Add("@Nota", SqlDbType.Int).Value = Nota
Return cmd.ExecuteNonQuery
End Function
End Class
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
80. Agregamos una nueva clase dentro de la capa NEGOCIO llamada N_Insertar y la codificamos como se indica:
Imports DATOS
Public Class N_Insertar
Public Function InsertarN(ByVal CodAlumno As String, ByVal Nombre As String, ByVal Apellidos As String, ByVal Especialidad As String, ByVal Curso As String, ByVal Turno As String, ByVal Nota As Integer) As Integer
Dim clsLogin As New D_Insertar
Return clsLogin.InsertarD(CodAlumno, Nombre, Apellidos, Especialidad, Curso, Turno, Nota)
End Function
End Class
81. Codificamos el evento Load del formulario frmAlumnos para que cargue los datos al iniciarse en el DataGridView1:
Private Sub frmAlumnos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim clsNegocio As New NEGOCIO.N_Listar
DataGridView1.DataSource = clsNegocio.ListarN.Tables(0)
End Sub
Y codificamos el botón “btnInsertar” del formulario frmAlumnos:
Private Sub btnInsertar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsertar.Click
Dim clsNegocio As New NEGOCIO.N_Insertar
Dim clsNegocio01 As New NEGOCIO.N_Listar
"Porque el secreto del desarrollo de una nación está en su educación"
Autor: Juan Marcelo Chamorro Avendaño E-mail: [email protected] Personal: http://marcelodata.blogspot.com
clsNegocio.InsertarN(txtCodAlumno.Text, txtNombre.Text, txtApellidos.Text, txtEspecialidad.Text, txtCurso.Text, txtTurno.Text, CInt(txtNota.Text))
DataGridView1.DataSource = clsNegocio01.ListarN.Tables(0)
End Sub
82. Al ejecutar e insertar un Nuevo item se vería así:
Se deja como trabajo utilizando todo lo aprendido implementar las interfaces y clases necesarias para que funcionen los botones Modificar y Eliminar.
Además filtrar la aplicación para mostrar a los alumnos por Código, Nombre, Apellidos, Especialidad, Curso, Turno o Nota.
Implementar un ejemplo de búsqueda por Código, Nombre, Apellidos, Especialidad, Curso, Turno o Nota.
Encriptar la Cadena de Conexión (Opcional).
Investigar y generar un reporte para imprimir (Opcional).
"Porque el secreto del desarrollo de una nación está en su educación"