lunes, 31 de diciembre de 2012

[ADO.NET] LOGIN CON MYSQL

Buenas tardes compañeros antes de empezar me gustaria comentar que esta es mi primera entrada y espero que les guste.Como sabemos un login es el proceso mediante el cual se controla el accesso a un sistema, es por esto que es de suma importancia a la hora de crear un sistema de información pero bueno empezemos con la programación

Lo que necesitamos saber es lo siguiente:

  • Tener conocimientos básicos de vb.net
  • Tener conocimientos básicos de sentencias sql
Como primer paso vamos abrir la consola de mysql y vamos a crear una tabla llamada usuarios la cual tendrá tres columnas
  • ID TIPO DE CAMPO INTEGER AUTONUMERICO
  • NOMBRE TIPO DE CAMPO VARCHAR
  • PASSWORD TIPO DE CAMPO VARCHAR
Segundo paso deberemos de agregar la referencia de la dll que nos provee mysql sino la tienes la puedes descargar del siguiente link:Ado.net mysql conector
















Tercer paso vamos a crear una clase llamada sentencias.vb(en caso de vb.net) ó sentencias.cs(en caso de c#) y agregaremos el siguiente código fuente pero ¿qué es exactamente lo que hace esta clase? Bueno básicamente contiene un procedimiento llamado login que es donde nosotros tendremos la comunicación con nuestra base de datos, es por esto que en el constructor de la clase pusimos un parametro de tipo String Despues igualamos ese parametro de tipo String con mi variable llamada Miruta. En el procedimiento llamado Login También tomamos dos variables de tipo string como parametros que son el Nombre de usuario y su Respectiva password Una vez obtenidos estos parametros declaramos un variable de tipo MysqlCommand(Esta es la que nos permitira realizar las instrucciones sql) y por supuesto también creamos una conexión con la rutaObtenida gracias al constructor de mi clase, Despues de esto creamos la instrucción sql y agregamos como paramtros los string obtenidos(NomUsuario y Password).Yo creo que el punto importante de este procedimiento es la instrucción ExecuteScalar básicamente lo que hace es devolver la primera columna de la primera fila del conjunto de resultados devuelto por la consulta. Las demás columnas o filas no se tienen en cuenta Una vez obtenida la columna lo que hacemos es un simple cast y con un if verificamos si la consulta devolvió un valor nullo(osea 0) ó devolvió un valor no nullo.Es aqui donde se aplica un poco la lógica, si devolvió un valor nullo quiere decir que el Nombre del usuario y la password no se encuentran alojados en la base de datos. Si devuelve un valor no nullo quiere decir que si estan alojados en la base de datos

[VB.NET]

Imports Mysql.Data.MySqlClient   'Agregamos la referencia para poder utilizar los metodos de la dll importada

Public Class Sentencias
    Private Miruta As String
    '//Constructor de la clase donde agregamos la ruta de conexion de la bd 
    Public Sub New(ByVal RutaBd As String)
        If (Not String.IsNullOrEmpty(RutaBd)) Then '//Verifico que la ruta de conexion no este vacia
            Me.Miruta = RutaBd
        End If
    End Sub

    '//Metodo donde revisaremos todos los datos

    Public Sub Login(ByVal NomUsuario As String, ByVal Password As String)
        Try 'Utilizaremos el bloque try catch... para controlar exepciones 

            Using MibdConexion As New MySqlConnection(Miruta)

                'Declaro comando para poder realizar mis instrucciones sql
                Dim micomando As New MySqlCommand
                '//Abrimos la conexion para poder realizar los sig pasos
                MibdConexion.Open()
                '//Establecemos propiedades al comando
                With micomando
                    .Connection = MibdConexion
                    .CommandText = "SELECT*FROM usuarios WHERE Nombre=?Nom AND Password=?Pass"
                    .Parameters.AddWithValue("?Nom", NomUsuario) '//Agrego los parametos en este caso es el string obtenido
                    .Parameters.AddWithValue("?Pass", Password)
                End With

                Dim NumEncontrado As Integer = CType(micomando.ExecuteScalar, Integer)

                If (NumEncontrado = 0) Then '//No se encontro ningun registro
                    MessageBox.Show("Lo siento no encontré ningun registro")
                Else
                    MessageBox.Show("Bienvenido te he encontradó en la bd XD")
                End If

            End Using

        Catch ex As Exception
            Throw New Exception(String.Format("Ha ocurrido un error {0}", ex.Message))
        End Try

    End Sub

End Class

[C#]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace sql
{
   public  class sentencias
    {
      private String Miruta;
       //Constructor de la clase donde agregamos la ruta de conexion de la bd
       public sentencias(String RutaBd) 
       {
           if (!String.IsNullOrEmpty(RutaBd))//Verifico que la ruta de conexion no este vacia
               this.Miruta = RutaBd;
       }

       public void Login(String NomUsuario, String Password)
       {
           try //Utilizaremos el bloque try catch... para controlar exepciones
           {
               using (MySqlConnection MidbConexion = new MySqlConnection(Miruta))
               {
                   MidbConexion.Open();//Abrimos la conexion para realizar los siguientes pasos
                   // 'Declaro comando para poder realizar mis instrucciones sql
                   MySqlCommand micomando = new MySqlCommand { Connection = MidbConexion, CommandText = "SELECT*FROM usuarios WHERE Nombre=?Nom AND Password=?Pass" };
                   micomando.Parameters.AddWithValue("?Nom", NomUsuario);
                   micomando.Parameters.AddWithValue("?Pass", Password);

                   int NumEncontrado = Convert.ToInt32(micomando.ExecuteScalar());

                   if(NumEncontrado==0)//No se encontro ningun registro
                         MessageBox.Show("Lo siento no encontré ningun registro");
                   else
                    MessageBox.Show("Bienvenido te he encontradó en la bd XD");


               }
           }
           catch(Exception ex)
           {
               throw new Exception(String.Format("Ha ocurrido un error {0}", ex.Message));
           }
       }
    }
}

Cuarto paso tenemos que crear un form que tenga el siguiente diseño
  • 2 TEXTBOX(UNO PARA LA EL NOMBRE DE USUARIO Y EL OTRO PARA LA PASSWORD)
  • 2 LABELS (UNA PARA EL NOMBRE DEL USUARIO Y LA OTRA PARA LA PASSWORD)
  • 1 BOTON SERVIRÁ PARA LLAMAR A NUESTRO PROCEDIMIENTO ALMACENADO EN NUESTRA CLASE
Quedaría algo así

Ahora bien en el evento click de nuestro boton haremos instancia a nuestra clase pero antes de esto es importante hacer unas cuantas validaciones de datos.Debemos de estar seguros que el textusurio y el txtpassword no esten vacios sino estan vacios entonces ahora si procedemos a declarar y hacer instancia a nuestra clase y llamamos a nuestro procedimiento llamado Login que es el que esta alojado en nuestra clase. Es importante resaltar que el string de la ruta de conexion en mi caso es el siguiente:"Data Source=localhost;Database=tutorial;Uid=root;Password=1234" si tu no tienes idea de cual es tu ruta de conexión deberia de checar este enlace rutas de conexión

[VB.NET]

    Private Sub BtnEntrar_Click(sender As System.Object, e As System.EventArgs) Handles BtnEntrar.Click

        Dim MierrorProvider As New ErrorProvider
        '//Validamos los textbox
        If (String.IsNullOrEmpty(txtusuario.Text)) Then
            MierrorProvider.SetError(txtusuario, "Inserta tu nombre de usuario")
        ElseIf (String.IsNullOrEmpty(txtpassword.Text)) Then
            MierrorProvider.SetError(txtpassword, "Inserta tu password")
        Else '//Si pasa por los dos parametros entonces llamo al procedimiento de mi clase
            Dim InstanciaMiclase As New Sentencias("Data Source=localhost;Database=tutorial;Uid=root;Password=1234")
            InstanciaMiclase.Login(txtusuario.Text, txtpassword.Text)
        End If

    End Sub

[C#]

  private void BtnEntrar_Click(object sender, EventArgs e)
        {
           ErrorProvider  MierrorProvider = new  ErrorProvider();
               //Validamos los textbox
             if (String.IsNullOrEmpty(txtusuario.Text))
                      MierrorProvider.SetError(txtusuario, "Inserta tu nombre de usuario");
             else if (String.IsNullOrEmpty(txtpassword.Text)) 
                      MierrorProvider.SetError(txtpassword, "Inserta tu password");
             else //Si pasa por los dos parametros entonces llamo al procedimiento de mi clase
           {
        sentencias InstanciaMiclase = new sentencias("Data Source=localhost;Database=tutorial;Uid=root;Password=1234");
        InstanciaMiclase.Login(txtusuario.Text, txtpassword.Text);
 
        }
        
        }

Finalmente para que el textbox que es asignado al campo password tenga la mascara de tipo password lo unico que tenemos que hacer es lo siguiente:

En el evento load de nuestro formulario agregamos lo siguiente:

[VB.NET]

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        txtpassword.UseSystemPasswordChar = True

    End Sub

[C#]


 private void Form1_Load(object sender, EventArgs e)
        {
            txtpassword.UseSystemPasswordChar = true;
        }
Ahora veremos el comportamiento de nuestro form en la siguiente imagen

Link de descarga de las soluciones!!

Espero que me hayan entendido espero sus comentarios un gran saludo XD