Implementar un proyecto en 3 capas + Sql Server + Store Procedure
Requerimientos previos:
- Visual Studio (la versión usada es 2012, pero se pueden usar las versiones 2005, 2008, 2010, 2014)
- Sql Server (la versión se deja a gusto del lector)
- SqlHelper.vb (lo podrán descargar del siguiente enlace: https://drive.google.com/file/d/0B06JT-pKtewcaXc3cFFQRV9vSEk/view?usp=sharing)
- Un poco de entusiasmo y ganas de aprender.
Pero, ¿Porque desarrollar en arquitectura de capas?
- Facilita su desarrollo al mantener un orden y separar las responsabilidades.
- Ayuda a reutilizar el código.
- Es escalable, ósea facilita a la modificación del proyecto en etapas avanzadas y en modificaciones futuras luego de concluir el proyecto.
- Fácil entendimiento del código fuente.
- Facilidad de migración de base de datos, entre otros.
Creando la solución
Implementar el proyecto
- Creamos el proyecto: "Archivo/Nuevo Proyecto..."
- Agregamos un nuevo proyecto (la Capa Lógica de Negocio): "Archivo/Agregar/ Nuevo proyecto..."
El sistema nos pedirá guardar el proyecto; deberás guardarlo con el nombre de SisPamf (o el nombre de tu proyecto elegido)Entonces tendremos lo siguiente - Agregamos la Capa de Acceso a Datos: "Archivo/Agregar/Nuevo proyecto..."; con el nombre de "AccesoDatos" y aceptar
- Agregar "Entidades" para nuestro proyecto: "Archivo/Agregar/Nuevo proyecto..."; con el nombre de "Entidades" y aceptar
-
Ahora tenemos que agregar las "referencias" a los proyectos, los cuales quedarán de la siguiente forma:
- Capa Presentación tendrá como referencia a: Capa Entidad y Capa Lógica: Clic derecho al nombre del proyecto "SistPamf" (Capa de Presentación) en el Explorador de soluciones, y seleccionar "Agregar Referencia"; una vez dentro, marcamos "Entidades" y "Lógica" y luego aceptamos.
- Capa Lógica tendrá como referencia a: Capa Entidad y Capa Acceso a Datos: Clic derecho al nombre del proyecto "SistPamf" (Capa de Presentación) en el Explorador de soluciones, y seleccionar "Agregar Referencia"; una vez dentro, marcamos "AccesoDatos" y "Entidades" y luego aceptamos.
- Ahora Crearemos una base de datos SQL con el nombre de: "Prueba_BD"Y ejecutaremos el siguiente script para la creación de la tabla y el procedimiento almacenado (Store Procedure):
1 USE [Prueba_BD] 2 GO 3 /****** Object: Table [dbo].[Usuarios] Script Date: 11/03/2015 15:15:38 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 SET ANSI_PADDING ON 9 GO 10 CREATE TABLE [dbo].[Usuarios]( 11 [Id_Usuario] [int] IDENTITY(1,1) NOT NULL, 12 [NombreUsuario] [varchar](15) NOT NULL, 13 [Contraseña] [varchar](50) NOT NULL, 14 [Estado] [nchar](1) NOT NULL 15 ) ON [PRIMARY] 16 GO 17 SET ANSI_PADDING OFF 18 GO 19 SET IDENTITY_INSERT [dbo].[Usuarios] ON 20 INSERT [dbo].[Usuarios] ([Id_Usuario], [NombreUsuario], [Contraseña], [Estado]) VALUES (1, N'Oswaldo', N'123', N'1') 21 SET IDENTITY_INSERT [dbo].[Usuarios] OFF 22 /****** Object: StoredProcedure [dbo].[S_ValidarUsuario] Script Date: 11/03/2015 15:15:40 ******/ 23 SET ANSI_NULLS ON 24 GO 25 SET QUOTED_IDENTIFIER ON 26 GO 27 -- ============================================= 28 -- Author: <Oswaldo Ríos Mozombite, orios@riossfotperu.com> 29 -- Create date: <31/10/2015> 30 -- Description: <Ejemplo para el blog> 31 -- Blog: <Ejemplo para el blog: http://vbnet-codigofuente.blogspot.pe/> 32 -- ============================================= 33 CREATE PROCEDURE [dbo].[S_ValidarUsuario] 34 -- Add the parameters for the stored procedure here 35 @Usuario as varchar(20) 36 AS 37 BEGIN 38 -- SET NOCOUNT ON added to prevent extra result sets from 39 -- interfering with SELECT statements. 40 SET NOCOUNT ON; 41 42 -- Insert statements for procedure here 43 SELECT Id_Usuario, NombreUsuario, Contraseña, Estado from Usuarios where NombreUsuario=@Usuario and Estado='1' 44 END 45 GO
- Para este ejemplo utilizararemos un la clase SqlHelper.vb (Encontraremos el link líneas arriba), el cual brinda un conjunto de metodos necesarios para la conexión con la base de datos, de esta forma solo necesitaremos sólo esta clase para nuesta capa Acceso a Datos.
- Procedemos a crear la clase que utilizaremos para nuestro inicio de sesión. Clic derecho en "Entidades" en el explorador de soluciones, luego en "Agregar/Clase..."
- Proceder a crear la clase "UsuarioL" en la "Capa Lógica de Negocio": hacemos clic derecho en "Lógica" en el Explorador de Soluciones, seleccionamos "Agregar/ Clase..", y nos aparecerá el siguiente.
- Ahora creamos el formulario para nuestro inicio de sesión. Clic derecho en el "Explorador de Soluciones" y luego seleccionamos "Agregar/Windows Forms..."
- Ahora realizamos las pruebas (La parte donde nos alegramos al ver que todo funciona)
Con el nombre de "SisPamf" (o elegimos el nombre que mejor les parezca)
Debe quedar de la siguiente forma:
Para hacer esto realizamos lo siguiente: Primero copiamos el archivo descargado en la carpeta "AccesoDatos" que se creo en la raiz de nuestro proyecto
Al copiar nos debería quedar así:
Ahora, agregamos la clase "SqlHelper.vb": Clic derecho en Acceso a datos en explorador de soluciones, "Agregar/Elemento existente..."
Seleccionamos la clase SqlHelper.vb y aceptamos
Una vez que agregamos la clase, tendremos la capa de acceso a datos listo para la conexión con la base de datos, ahora nos pasamos a la "Entidades"
Con el nombre de "UsuarioE":
Con el siguiente código:
1 Public Interface I_UsuarioE 2 Property iId_Usuario() As Integer 3 Property iNombreUsuario() As String 4 Property iContraseña() As String 5 Property iEstado() As String 6 End Interface 7 Public Class UsuarioE 8 Implements I_UsuarioE 9 10 Private xId_Usuario As String = "" 11 Private xNombreUsuario As String = "" 12 Private xContraseña As String = "" 13 Private xEstado As String = "" 14 15 Public Property iContraseña As String Implements I_UsuarioE.iContraseña 16 Get 17 Return xContraseña 18 End Get 19 Set(ByVal Value As String) 20 xContraseña = Value 21 End Set 22 End Property 23 24 Public Property iEstado As String Implements I_UsuarioE.iEstado 25 Get 26 Return xEstado 27 End Get 28 Set(ByVal Value As String) 29 xEstado = Value 30 End Set 31 End Property 32 Public Property iId_Usuario As Integer Implements I_UsuarioE.iId_Usuario 33 Get 34 Return xId_Usuario 35 End Get 36 Set(ByVal Value As Integer) 37 xId_Usuario = Value 38 End Set 39 End Property 40 Public Property iNombreUsuario As String Implements I_UsuarioE.iNombreUsuario 41 Get 42 Return xNombreUsuario 43 End Get 44 Set(ByVal Value As String) 45 xNombreUsuario = Value 46 End Set 47 End Property 48 End Class
El código fuente lo podemos encontrar en el archivo final del ejemplo.
Creamos la clase "UsuarioL"
Y escribimos el siguiente código en el.
1 Imports Entidades 'Hacemos referencia a las Entidades de nuestro proyecto" 2 Imports AccesoDatos 'Hacemos referencia a la Capa de Acceso a Datos" 3 Public Interface I_USUARIOL 4 'Creamos la función Validar Contraseña y enlazamos con la entidad 5 Function ValidarContraseña(ByVal ConecX As String, ByVal eUsuarioE As Entidades.UsuarioE) As Boolean 6 End Interface 7 Public Class UsuarioL 8 Implements I_USUARIOL 9 10 Public Function ValidarContraseña(ConecX As String, eUsuarioE As UsuarioE) As Boolean Implements I_USUARIOL.ValidarContraseña 11 Dim Ds_Usuario As DataSet 12 Dim xExiste As Integer 13 Dim strSP As String = "S_ValidarUsuario" 'Aquí va el nombre del Procedimiento almacenado de nuestro SQL Server 14 Try 15 'A la Base de datos solamente le vamos a enviar el Nombre de Usuarios 16 Ds_Usuario = SqlHelper.ExecuteDataset(ConecX, strSP, eUsuarioE.iNombreUsuario) 'Agregamos las variables de "Entidades" que vamos a usar 17 18 xExiste = Ds_Usuario.Tables(0).Rows.Count 'Verificamos existen datos de nuestras credenciales 19 If xExiste <> 0 Then ' Al ubicar nuestro usuario, el registro que obtenemos debe ser mayor a 0 20 If Ds_Usuario.Tables(0).Rows(0).Item(2).ToString = eUsuarioE.iContraseña Then 'Aquí vericaremos si la contraseña es igual al que le enviamos, el Item(2) indíca que obtendra el dato de la columna que esta posición 3 21 Return True 'En caso de ser la contraseña correcta, retornaremos el valor de true a nuestra capa presentación 22 End If 23 Else 24 Return False 'En caso de ser la contraseña incorrecta, retornaremos el valor de false a nuestra capa presentación 25 End If 26 'El motívo por el cual solo se envía el usuario a la base de datos es para evitar los ataques "SQL Inyection" 27 Catch ex As Exception 28 Throw ex 29 End Try 30 End Function 31 End Class
Creamos el formulario con el nombre de "LoginForm1"
Con este formulario que viene en forma predeterminada en el visual studio, tendremos lo necesario para realizar nuestro formulario de inicio de sesión.
Hacemos doble clic en el botón aceptar formulario LoginForm1 y tendremos lo siguiente
Remplazamos por el siguiente código
1 Imports Entidades 'Improtamos la clase Entidades 2 Public Class LoginForm1 3 Public ConecX As String 'Creación de la variable para el string de conexión 4 Dim ObjUsuarioL As New Logica.UsuarioL 'agregamos nuestro objeto UsuarioL para obtener los metodos que usaremos 5 Dim ObjUsuarioE As New Entidades.UsuarioE 'Creación del Objeto en Entidades 6 Dim xCont As Integer 'Será nuestro contador de Intentos de sesión 7 8 Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click 9 ValidarUsuario() 10 End Sub 11 12 Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel.Click 13 Me.Close() 14 End Sub 15 Private Sub ValidarUsuario() 16 'Sera nuestro string de conexión con la base de datos 17 'Data source: es el nombre de nuestro servidor SQL 18 'Initial catalog: es el nombre de nuestra base de datos 19 'User id: es el usuario de inicio de sesión en el Sql Server 20 'Password: es la contraseña utilizada para el inicio de sesión del sql server 21 22 'Este línea de conexión puede ser creado en un Módulo a parte como variable global, 23 'pero como solo tendremos un formulario y esto es un ejemplo lo dejaremos así 24 ConecX = "data source = DALOWOS\LINK; initial catalog = Prueba_BD; user id = sa; password =dalowos" 25 26 'Creación de las variables locales 27 Dim xUsuario As String 28 Dim xPassword As String 29 Dim xExiste As Boolean ' esta variable como indicador de la existencia del usuario en la base de datos 30 31 32 xExiste = False 33 xUsuario = "" 34 xPassword = "" 35 36 ObjUsuarioE.iNombreUsuario = UsernameTextBox.Text ' Asignamos el valor del texto Usuario a nuestra Entidad 37 ObjUsuarioE.iContraseña = PasswordTextBox.Text ' Asignamos el valor del texto Contraseña a nuestra Entidad 38 xExiste = ObjUsuarioL.ValidarContraseña(ConecX, ObjUsuarioE) 'Enviamos el objeto ObjUsuario a nuestra capa de lógica 39 40 If xExiste = True Then 41 MsgBox("la contraseña es correcta, bienvenido la Sistema", MsgBoxStyle.OkOnly) 42 Else 43 MsgBox("Usuario y/o Contraseña incorrecta", MsgBoxStyle.Critical, "Informe de Error") 44 If xCont = 3 Then 'En caso llegar al tercer intento te saldrá el siguiente mensaje de error y te expulsará del sistema 45 MsgBox("Exedió el número de intentos", MsgBoxStyle.Critical, "Informe de Error") 46 Me.Close() 47 End If 48 xCont += 1 'Aquí sumaremos +1 cada vez que el usuario se equivoca al ingresar 49 End If 50 End Sub 51 52 Private Sub LoginForm1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 53 'Inicamos variables 54 'Contador en 1 55 xCont = 1 56 End Sub 57 End Class
No olvidar eliminar el Form1 para que lo primero que aparezca sea el LoginForm1.
Hacemos clic en Iniciar.
Nos tendría que salir el formulario que hemos creado "FormLogin1"
Utilizamos las siguientes credenciales para ingresar:
Nombre de Usuario: oswaldo
Contraseña: 123
y nos debería mostrar el mensaje de contraseña correcta.
Con esto terminamos el formulario de inicio de sesión en tres (3) capas en visual studio .net con SQL Server.
Tal como prometí, el link código fuente del proyecto
Si tienen alguna duda o sugerencia, no duden en comentar o escribirme al correo dalowos@gmail,com
no funciona el enlace compañero
ResponderBorrarhttps://drive.google.com/file/d/0B06JT-pKtewcNUs2ZUFGbXRtXzg/view?usp=sharing
Borrar