none
Validad ventana de WindowsForms con base de datos (acess) RRS feed

  • Pregunta

  • Hola tengo un proyecto de encuestas, tengo todo el esqueleto ya armado. El problema es que no puedo hacer que de de la ventana de Login se valide los usuarios que ya tengo cargado en la base de datos que esta en un Acess aca dejo la parte del codigo donde tengo problema. Muchas gracias

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using Repository.Model;
    using Repository;
    using TPEncuestaWin;
    
    namespace TPEncuestaWin {
      public partial class FrmMain : Form {
        public FrmMain() {
          InitializeComponent();
        }
    
        private void FrmMain_Load(object sender, EventArgs e)
        {
            FrmLogin f = new FrmLogin();
            if (f.ShowDialog() == DialogResult.OK)
            {
                ContextRepository cx = new ContextRepository("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=direccion base de datos");
                Usuario u = cx.GetUsuario(f.GetTbLogin());
                if (u !=null)
                {
                   
                    if(u.Password= ){
    
                    
                    }else{
                    
                    }
                }
                else
                {
                   
                }
    
                }
                else
                {
                    MessageBox.Show("Tiene que ingresar datos");
                    Application.Exit();
    
                };
            }
        }
    
        private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
    
        }
      }
    }

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using Repository;
    using Repository.Model;
    
    namespace TPEncuestaWin
    {
        public partial class FrmLogin : Form
        {
            public FrmLogin()
            {
                InitializeComponent();
            }
            private void FrmLogin_Load(object sender, EventArgs e)
            {
    
            }
    
            public string GetTbLogin(){
                return tbUsuario.Text;
            }
    
            private void tbUsuario_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void tbPassword_TextChanged(object sender, EventArgs e)
            {
    
            }
        }
    }
    

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data.SqlClient;
    using System.Data.OleDb;
    using Repository.Model;
    
    namespace Repository {
    
    
    
        public class ContextRepository {
            private String ConnectionString;
    
            //Lista de usuarios precargados, cuando el contexto retorna algo
            //debe guardar la referencia para poder salvarlo posteriorme.
            //Si se vuelve a pedir por el mismo elemento se toma de la lista y no se
            //vuelve a consultar a la base de datos
    
            private List<Usuario> lu = new List<Usuario>();
    
            public ContextRepository(String cs) {
                ConnectionString = cs;
    
            }
    
    
            public List<Usuario> GetUsuarios() {
    
    
                //Existen varias formas de resolver esto, como es la tabla usuario que se presume pequeña traigo
                //todos los registros inserto en la lista que un metodo especial que preguntara si el objeto existe o no.
                //Se veran mas adelante formas mas inteligentes de hacer esto esto
    
                OleDbConnection conn = new OleDbConnection(this.ConnectionString);
                conn.Open();
                OleDbCommand comm = new OleDbCommand("Select * from Usuario", conn);
                OleDbDataReader dr = comm.ExecuteReader();
                if (dr.HasRows) {
    
                    while (dr.Read()) {
                        Usuario u = new Usuario();
                        u.Login = dr["Login"].ToString();
                        u.Password = dr["Password"].ToString();
                        u.Nombre = dr["Nombre"].ToString();
                        AddToList(u);
                    };
    
                } else {
    
                }
                return lu;
    
            }
    
    
            public List<TipoEncuesta> GetTiposEncuesta() {
                List<TipoEncuesta> result = new List<TipoEncuesta>();
    
                OleDbConnection connection = new OleDbConnection(ConnectionString);
                connection.Open();
    
                OleDbCommand c1 = new OleDbCommand("Select * from TipoEncuesta", connection);
                OleDbDataReader dr1 = c1.ExecuteReader();
    
                while (dr1.Read()) {
                    TipoEncuesta te = new TipoEncuesta();
                    te.Idtipoencuesta = Convert.ToInt32(dr1["IdTipoEncuesta"]);
                    te.Nombre = dr1["Nombre"].ToString();
                    result.Add(te);
                }
    
    
                return result;
            }
    
    
            private void AddToList(Usuario u) {
                //busco si el usuario existe, sino lo agrego a la lista
                //.Net tiene formas mejores de realizar esto, en lugar de busqueda secuencial
                //Se pueden utilizar metodos anonimos y el metodo find de la lista
                Boolean encontrado = false;
                foreach (Usuario usuarioenlista in lu) {
                    if (usuarioenlista.Login == u.Login) {
                        //Existe, no hay nada que hacer por ahora
                        encontrado = true;
                    } else {
    
                        //No existe debo agregar a mi lista
                        
                    }
                }
    
                if (!encontrado) {
                    lu.Add(u);
                }
    
    
    
            }
    
    
    
            public Usuario NuevoUsuario() {
                return null;
            }
    
            public Usuario GetUsuario(String Login) {
                
                //Tarea para el grupo: Aplicar la tecnica de lista cache en este metodo tambien
                OleDbConnection conn = new OleDbConnection(this.ConnectionString);
                conn.Open();
                OleDbCommand comm = new OleDbCommand("Select * from Usuario Where Login=@Login", conn);
                comm.Parameters.AddWithValue("@Login", Login);
    
                OleDbDataReader dr = comm.ExecuteReader();
                if (dr.HasRows) {
                    dr.Read();
                    Usuario Result = new Usuario();
    
    
                    Result.Login = dr["Login"].ToString();
                    Result.Password = dr["Password"].ToString();
                    Result.Nombre = dr["Nombre"].ToString();
    
                    return Result;
                }
                return null;
    
            }
        }
    }

    • Cambiado Karen Malagón jueves, 11 de junio de 2015 19:48 Windows Forms issue
    miércoles, 10 de junio de 2015 23:41

Todas las respuestas

  • Hola amigo

    creo que te falta validar los datos ingresados contra tu BD, no veo como lo estas realizando.

    podrias intentar con este codigo en la validacion de usuarios, tal vez te funcione

    string constring = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=  C:\Users\jay.desai\Documents\Visual Studio 2008\Projects\Jahoo Sign in form!\Jahoo Sign in form!\Registration_form.mdb";
    string cmdText = "select Count(*) from Login where Username=? and [Password]=?"
    using(OleDbConnection con = new OleDbConnection(constring))
    using(OleDbCommand cmd = new OleDbCommand(cmdText, con))
    {
         con.Open();
         cmd.Parameters.AddWithValue("@p1", txtlognUsrnm.Text);
         cmd.Parameters.AddWithValue("@p2", txtlognpswrd.Text);  // <- is this a variable or a textbox?
         int result = (int)cmd.ExecuteScalar()
         if(result > 0)
              MessageBox.Show("Login Successful");
         else
             MessageBox.Show("Invalid Credentials, Please Re-Enter");
    }
    

    SI MI RESPUESTA TE FUE DE UTILIDAD, AYUDAME CON UN VOTO UTIL

    SALUDOS

    miércoles, 10 de junio de 2015 23:59
  • hola

    hay varias formas de implementar lo que planteas, por el camino que pones en el codigo pareciera que recuperas la db al usuario para comparar el password

    pero algo que no entiendo es porque no implementas esta validacion dentro del form de login? no me cierra que tengas que hacerlo desde TPEncuestaWin

    el login se implementa desde el Main() que esta en Programs.cs previo a definir un form principal

    como lo explico aqui

    Usando Password con Hash

    analiza el titulo "Autenticación desde una aplicación Winform" donde se define la autenticacion

    a donde apunto es que es incorrecto invocar el form de login desde TPEncuestaWin

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 11 de junio de 2015 1:33
  • Muchas gracias por contestar!!!

    La parte de codigo que me dijiste iria en lugar de esta???

    if (u !=null)
                {
                   
                    if(u.Password= ){
    
                    
                    }else{
                    
                    }
                }
                else
                {
                   
                }
    
                }
                else
                {
                    MessageBox.Show("Tiene que ingresar datos");
                    Application.Exit();
    
                };
    ¿Que serian txtlognUsrnm y txtlognpswrd? ¿los nombres de los textbox de mi ventana de login?


    jueves, 11 de junio de 2015 1:34
  • Hola aca lo explico:  la idea es que haya una form principal y que al abrirla se abra otra con la ventana de login y que si el login es correcto volver a la anterior.

    Muchas gracias por contestar

    • Marcado como respuesta SebastianCeru jueves, 11 de junio de 2015 15:00
    • Desmarcado como respuesta SebastianCeru jueves, 11 de junio de 2015 15:00
    jueves, 11 de junio de 2015 14:52
  • hola

     >>la idea es que haya una form principal y que al abrirla se abra otra con la ventana de login y que si el login es correcto volver a la anterior.

    no se hace de esa forma, podrias mostrar un splash screen, luego el de login y por ultimo el form principal

    pero estos 3 form los abres desde el Main() de Program.cs

    eso de msotrar el form principal y sobre este el login no lo aconsejaria porque causa problemas en la secuancia de los forms como los visualizas

    analiza el articulo que propuse y veras como se da de frma natural la validacion del login

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 11 de junio de 2015 15:12
  • Gracias por responder de nuevo!

    Lo de modificar como se hace no lo puedo hacer porque es un TP de la facu y ya me dieron el esqueleto y solo se puede hacer asi :(
    Ahi le di una mirada por arriba al articulo (justo me tengo que ir a la noche lo veo mejor) el problema es que si no entendi mal en el articulo utilizan una base de datos sql yo si o si lo tengo que hacer en una de access

    jueves, 11 de junio de 2015 21:18