En este tutorial práctico, continuaremos con la creación de una aplicación de Windows Forms (WinForms) haciendo uso del IDE Visual Studio 2019. Este caso desarrollaremos el también ya conocido LOGIN con el lenguaje de programación C#, con base de datos en SQL Server en base a Store Procedure (procedimientos almacenado) y POO (programación orientado a objetos).
Lo que veremos en este tutorial:
- Requisitos.
- Crear nuevos Procedimiento Almacenados de base de datos.
- Proyecto según la arquitectura de N-Capas.
- Implementar las funciones para el acceso a la aplicación en la capa de datos.
- Referenciar e implementar las funciones en la capa del negocio.
- Diseñar e implementar la capa interfaz de nuestra aplicación - LOGIN.
- Conclusiones.
Requisitos:
- Microsoft Visual Studio Community 2019
- .NET Framework 4.6 con C# como lenguaje de programación
- Microsoft SQL Server Management Studio
- Transact-SQL como lenguaje de base de datos para SQL Server
Crear nuevos Procedimiento Almacenados de base de datos:
Crearemos los procedimiento almacenado SP_VAL_EXISTE_USUARIO y SP_LOGIN_USUARIO en la base de datos BD_TEST visto en el articulo de elaboración de CRUD - Base de Datos con Microsoft SQL Server 2019.
SP_VAL_EXISTE_USUARIO:
1 2 3 4 5 6 7 8 9 10 11 12 | CREATE PROCEDURE [dbo].[SP_VAL_EXISTE_USUARIO] ( @PC_USUARIO VARCHAR(50), @PNO_RETORNO NUMERIC OUTPUT ) AS SELECT @PNO_RETORNO = ISNULL((SELECT COUNT(1) FROM dbo.USUARIO WHERE USUARIO = @PC_USUARIO) ,0) RETURN @@TOTAL_ERRORS |
SP_LOGIN_USUARIO:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE PROCEDURE [dbo].[SP_LOGIN_USUARIO]
(
@PC_USUARIO VARCHAR(50),
@PC_CONTRASENA VARCHAR(50),
@PNO_RETORNO NUMERIC OUTPUT
)
AS
SELECT @PNO_RETORNO =
ISNULL((SELECT COUNT(1)
FROM dbo.USUARIO
WHERE USUARIO = @PC_USUARIO AND
CONTRASENA = @PC_CONTRASENA) ,0)
RETURN @@TOTAL_ERRORS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | CREATE PROCEDURE [dbo].[SP_LOGIN_USUARIO] ( @PC_USUARIO VARCHAR(50), @PC_CONTRASENA VARCHAR(50), @PNO_RETORNO NUMERIC OUTPUT ) AS SELECT @PNO_RETORNO = ISNULL((SELECT COUNT(1) FROM dbo.USUARIO WHERE USUARIO = @PC_USUARIO AND CONTRASENA = @PC_CONTRASENA) ,0) RETURN @@TOTAL_ERRORS |
Proyecto según la arquitectura de N-Capas:
La arquitectura esta en N-Capas es decir es la misma que se realizo y explico en el anterior tutorial práctico acerca de Windows Forms - CRUD con Visual Studio y SQL Server, recordemos que con esta arquitectura, los usuarios realizan solicitudes a través de la capa de interfaz de usuario, que interactúa con la capa BLL. BLL, a su vez, puede llamar a DAL para las solicitudes de acceso de datos. La capa de interfaz de usuario no debe realizar solicitudes directamente a DAL, ni debe interactuar con la persistencia de forma directa a través de otros medios. Del mismo modo, BLL solo debe interactuar con la persistencia a través de DAL.
Implementar las funciones para el acceso a la aplicación en la capa de datos.
Ahora implementaremos 2 funciones, la primera función será para la validación del registro de la cuenta del usuario, la segunda función será para el acceso a la aplicación según la cuenta y contraseña del usuario.
Recodemos que las funciones creadas, se crean en el proyecto de la CapaDatos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | /// <summary> /// Funcion para validar la existencia del registro de la cuenta del usuario /// </summary> /// <param name="pStr_CodUsuario"></param> /// <returns></returns> public bool F_ValUsuario(string pStr_CodUsuario) { int lDec_Existe; comando.Connection = conexion.OpenConnection(); try { comando.CommandType = CommandType.StoredProcedure; comando.CommandText = "SP_VAL_EXISTE_USUARIO"; comando.Parameters.Clear(); comando.Parameters.AddWithValue("@PC_USUARIO", pStr_CodUsuario); comando.Parameters.Add("@PNO_RETORNO", SqlDbType.Decimal, 10).Direction = ParameterDirection.Output; comando.ExecuteNonQuery(); lDec_Existe = Convert.ToInt32(comando.Parameters["@PNO_RETORNO"].Value); if (lDec_Existe == 0) return false; else return true; } catch (Exception ex) { throw new Exception(ex.Message); return false; } finally { comando.Connection.Close(); } } /// <summary> /// Función para el acceso a la aplicación /// </summary> /// <param name="pStr_CodUsuario">Valor de la cuenta del usuario</param> /// <param name="pStr_Contrasena">Contraseña segun la cuenta del usuario</param> /// <returns></returns> public bool F_LoginUsuario(string pStr_CodUsuario, string pStr_Contrasena) { int lDec_Existe; comando.Connection = conexion.OpenConnection(); try { comando.CommandType = CommandType.StoredProcedure; comando.CommandText = "SP_LOGIN_USUARIO"; comando.Parameters.Clear(); comando.Parameters.AddWithValue("@PC_USUARIO", pStr_CodUsuario); comando.Parameters.AddWithValue("@PC_CONTRASENA", pStr_Contrasena); comando.Parameters.Add("@PNO_RETORNO", SqlDbType.Decimal, 10).Direction = ParameterDirection.Output; comando.ExecuteNonQuery(); lDec_Existe = Convert.ToInt32(comando.Parameters["@PNO_RETORNO"].Value); if (lDec_Existe == 0) return false; else return true; } catch (Exception ex) { throw new Exception(ex.Message); return false; } finally { comando.Connection.Close(); } } |
Referenciar e implementar las funciones en la capa del negocio.
Seguidamente referenciamos las funciones F_ValUsuario y F_LoginUsuario que fueron creadas en la capa de datos:
1 2 3 4 5 6 7 8 9 | public bool F_ValUsuario(string pStr_CodUsuario) { return objetoCD.F_ValUsuario(pStr_CodUsuario); } public bool F_LoginUsuario(string pStr_CodUsuario, string pStr_Contrasena) { return objetoCD.F_LoginUsuario(pStr_CodUsuario, pStr_Contrasena); } |
Diseñar e implementar la capa interfaz de nuestra aplicación - LOGIN.
Para el diseño crearemos un From y agregaremos los siguientes controles con TextBox (para la contraseña haremo uso de proopiedad PasswordChar = *) y Button.
Diseño Inicial |
Mensaje que falta ingresar los datos |
Mensaje de validación de usuario |
Finalmente implementaremos el code behind c# de nuestro From:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | using CapaNegocio; using System; using System.Windows.Forms; namespace CapaPresentacion { public partial class FrmLogin : Form { BLLUsuario objetoCN = new BLLUsuario(); public FrmLogin() { InitializeComponent(); } private void btnAceptar_Click(object sender, EventArgs e) { FrmUsuario frmUsuario = new FrmUsuario(); try { //Validación de controles if (textBox1.Text == "") { MessageBox.Show("Falta Ingresar el Usuario", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information); textBox1.Focus(); return; } if (textBox2.Text == "") { MessageBox.Show("Falta Ingresar la Contraseña", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information); textBox2.Focus(); return; } //Validar registro de usuario en base de datos bool boolValUsuario = objetoCN.F_ValUsuario(textBox1.Text); if (boolValUsuario == false) { MessageBox.Show("El Usuario no se encuentra registrado", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information); textBox1.Focus(); return; } else { //Validar registro de usuario en base de datos bool boolLoginUsuario = objetoCN.F_LoginUsuario(textBox1.Text, textBox2.Text); if (boolLoginUsuario == false) { MessageBox.Show("El Usuario o Contraseña no Coinciden", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information); textBox1.Focus(); return; } else { frmUsuario.Show(this); this.Hide(); } } } catch (Exception ex) { MessageBox.Show("No se acceder, se encontro el siguiente error : " + ex); } } private void btnCancelar_Click(object sender, EventArgs e) { Close(); } } } |
Conclusiones.
Se implemento el ejemplo práctico LOGIN para Windows Forms haciendo uso de Transact-SQL para las funciones de validaciones y acceso a la aplicación en base a ADO.Net y el lenguajes de programación como es C#.
Descarga la fuente:
Directorio 02-LOGIN |
Gratitud a Dios 😊 y gracias a todos ustedes por la acogida de este nuevo articulo, éxitos y bendiciones 🙏 y un gran abrazo a todos ✌...!!!
0 Comentarios