Login que indique individualmente se Usuário inválido ou senha Inválida
Bem pessoal o título já diz o objetivo não alcançado até agora, tenho este código para um login em windows form C#, mas quando digitado algo inválido não acontece nada, mas deveria dizer "Login inválido" se for o login que não está cadastrado e dizer "Senha inválida" se for a senha que não está cadastrada.
O que está faltando ou o que tem de mais ?
Acho que o problema está no SELECT e nos if, mas não sei o que fazer...
Agradeço toda ajuda...
O que está faltando ou o que tem de mais ?
Acho que o problema está no SELECT e nos if, mas não sei o que fazer...
Agradeço toda ajuda...
private void BtnEntrar_Click(object sender, EventArgs e) { try { OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\BDBiblioteca.mdb;Jet OLEDB:Database Password = 123"); OleDbCommand comando = new OleDbCommand("SELECT * FROM Funcionario F " + " INNER JOIN Perfil P ON F.Perfil = P.IDPerfil Where F.Login = @Login And F.Senha = @Senha AND F.Situacao = true", conexao); comando.Parameters.AddWithValue("@Login ", loginTextBox.Text); comando.Parameters.AddWithValue("@Senha", senhaTextBox.Text); conexao.Open(); OleDbDataReader reader = null; reader = comando.ExecuteReader(CommandBehavior.CloseConnection); if ((reader.HasRows) && (reader.Read())) { if (loginTextBox.Text != reader["login"].ToString()) { MessageBox.Show("Usuário Inválido !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning); loginTextBox.Clear(); loginTextBox.Focus(); } else if (senhaTextBox.Text != reader["senha"].ToString()) { MessageBox.Show("Senha Inválida !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning); senhaTextBox.Clear(); senhaTextBox.Focus(); } else { usuarioConectado = loginTextBox.Text; NivelAcesso = (reader["Descricao"].ToString()); usuConectNome = (reader["F.Nome"].ToString()); FrmPrincipal frmp = new FrmPrincipal(); frmp.NivelAcesso = Convert.ToString(NivelAcesso); frmp.usuarioConectado = usuarioConectado; frmp.usuConectNome = usuConectNome; frmp.Show(); this.Hide(); } reader.Close(); } } catch(Exception ex) { MessageBox.Show("Não foi Possível Entrar !" + ex.Message, "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
Jair Souza
Curtidas 0
Melhor post
Kelvin Ott
26/08/2014
Faça o select filtrando pelo login do funcionário e retornando a senha, se o select não retornar ninguém o login está errado. Se retornar porém a senha retornada não bate com a senha digitada a senha está errada.
SELECT F.Senha FROM Funcionario F " + " INNER JOIN Perfil P ON F.Perfil = P.IDPerfil Where F.Login = @LOGIN AND F.Situacao = true
GOSTEI 1
Mais Respostas
Jair Souza
25/08/2014
Não funcionou, dá erro de login...
[img]http://arquivo.devmedia.com.br/forum/imagem/343353-20140826-185417.png[/img]
Tentei dessa outra maneira, e acontece algo muito estranho, quando se digita o login ou senha errado os "if" atuam e dão a mensagem e quando digitado login e senha corretos só entra pro primeiro funcionário(Não consigo entender isto), para os outros 24 funcionário cadastrados da a mensagem de inválido...
[img]http://arquivo.devmedia.com.br/forum/imagem/343353-20140826-190350.png[/img]
...e assim não entra nos "if" :
[img]http://arquivo.devmedia.com.br/forum/imagem/343353-20140826-185417.png[/img]
Tentei dessa outra maneira, e acontece algo muito estranho, quando se digita o login ou senha errado os "if" atuam e dão a mensagem e quando digitado login e senha corretos só entra pro primeiro funcionário(Não consigo entender isto), para os outros 24 funcionário cadastrados da a mensagem de inválido...
OleDbCommand comando = new OleDbCommand("SELECT * FROM Funcionario F " + " INNER JOIN Perfil P ON F.Perfil = P.IDPerfil Where F.Login = @Login OR F.login IS NOT NULL And F.Senha = @Senha OR F.Senha IS NOT NULL AND F.Situacao = true", conexao);
[img]http://arquivo.devmedia.com.br/forum/imagem/343353-20140826-190350.png[/img]
...e assim não entra nos "if" :
OleDbCommand comando = new OleDbCommand("SELECT * FROM Funcionario F " + " INNER JOIN Perfil P ON F.Perfil = P.IDPerfil Where F.Login = @login OR F.Login Is Null AND F.Senha = @senha OR F.Senha Is Null AND F.Situacao = true", conexao);
GOSTEI 0
Joel Rodrigues
25/08/2014
Pra esse tipo de verificação, geralmente eu faço da seguinte forma:
Primeira verificação: se não retornar nenhuma linha, é porque o login não existe.
Segunda verificação: se retornar uma linha (o login está correto), verificar se o conteúdo da coluna SENHA é igual ao que foi digitado. Se não for, a senha está incorreta.
SELECT LOGIN, SENHA FROM USUARIOS WHERE LOGIN=@Login
Primeira verificação: se não retornar nenhuma linha, é porque o login não existe.
Segunda verificação: se retornar uma linha (o login está correto), verificar se o conteúdo da coluna SENHA é igual ao que foi digitado. Se não for, a senha está incorreta.
GOSTEI 1
Jair Souza
25/08/2014
Sim e é isto que pensava estar fazendo...
Se não parametrizo a senha como posso compará-la ?
...o que preciso mudar neste meu código inicial, objetivamente ?
Se não parametrizo a senha como posso compará-la ?
...o que preciso mudar neste meu código inicial, objetivamente ?
GOSTEI 0
Joel Rodrigues
25/08/2014
Como eu citei no meu exemplo, você não faz a busca pela senha, faz apenas pelo login e recupera a senha referente a esse login.
SE o login estiver correto, então você compara com a senha que veio do select.
SE o login estiver correto, então você compara com a senha que veio do select.
GOSTEI 1
Kelvin Ott
25/08/2014
Leia com atenção, entenda o que está sendo dito no tópico, em seguida tente programar.
GOSTEI 1
Jair Souza
25/08/2014
Entendi a lógica, vou testar.
GOSTEI 0
Jair Souza
25/08/2014
Fiz as alterações, mas não sei como fazer a recuperação e a comparação da senha...pois se não leu não pode ser assim
Como será ?
else if (senhaTextBox.Text != reader["Senha"].ToString())
Como será ?
GOSTEI 0
Kelvin Ott
25/08/2014
//Se entrar aqui o login é válido if(reader.HasRows) { //Validação de senha, se for igual a senha também está correta if(senhaTextBox.Text == reader["senha"].ToString()) { } else { //Mensagem senha errada } } else { //Mensagem login errado }
GOSTEI 1
Jair Souza
25/08/2014
...e tem também a verificação da situação que é "true" para ativo e "false" para inativo, como pode-se encaixar neste código, e dar uma mensagem de sem permissão no caso de "false", é bool e não sei como como recuperar e comparar ?
Estava no código inicial, mas acabou ficando de fora, rrrrs...
Estava no código inicial, mas acabou ficando de fora, rrrrs...
OleDbCommand comando = new OleDbCommand("SELECT * FROM Funcionario F " + " INNER JOIN Perfil P ON F.Perfil = P.IDPerfil Where F.Login = @Login And F.Senha = @Senha AND F.Situacao = true", conexao);
GOSTEI 0
Joel Rodrigues
25/08/2014
Aproveitando o código do Kelvin:
//Se entrar aqui o login é válido if(reader.HasRows) { //Validação de senha, se for igual a senha também está correta if(senhaTextBox.Text == reader["senha"].ToString()) { if(Convert.ToBoolean(reader["ativo"]) { // Usuário ativo e senha correta } else { // Mensagem de usuário inativo } } else { //Mensagem senha errada } } else { //Mensagem login errado }
GOSTEI 1
Jair Souza
25/08/2014
Alterei como vocês orientaram, e não estava funcionando dava erro "No data exists for the row/column", ajustei esta linha de "if (reader.HasRows)" para "if ((reader.HasRows) && (reader.Read()))", e foi só alegria, funcionou perfeitamente.
Valeu muito, muito... Kelvin e Joel, estou aprendendo muito com vocês, fiquem com Deus.
Ficou assim :
Valeu muito, muito... Kelvin e Joel, estou aprendendo muito com vocês, fiquem com Deus.
Ficou assim :
private void BtnEntrar_Click(object sender, EventArgs e) { try { OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\BDBiblioteca.mdb;Jet OLEDB:Database Password = grazi1vini2"); OleDbCommand comando = new OleDbCommand("SELECT * FROM Funcionario F " + " INNER JOIN Perfil P ON F.Perfil = P.IDPerfil WHERE F.Login = @login", conexao); comando.Parameters.AddWithValue("@login ", loginTextBox.Text); OleDbDataReader reader = null; conexao.Open(); reader = comando.ExecuteReader(CommandBehavior.CloseConnection); if ((reader.HasRows) && (reader.Read())) { if(senhaTextBox.Text == reader["senha"].ToString()) { if(Convert.ToBoolean(reader["situacao"])) { usuarioConectado = loginTextBox.Text; NivelAcesso = (reader["Descricao"].ToString()); usuConectNome = (reader["F.Nome"].ToString()); FrmPrincipal frmp = new FrmPrincipal(); frmp.NivelAcesso = Convert.ToString(NivelAcesso); frmp.usuarioConectado = usuarioConectado; frmp.usuConectNome = usuConectNome; frmp.Show(); this.Hide(); } else { MessageBox.Show("Sem Permissão de Acesso !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning); loginTextBox.Clear(); senhaTextBox.Clear(); loginTextBox.Focus(); } } else { MessageBox.Show("Senha Inválida !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning); senhaTextBox.Clear(); senhaTextBox.Focus(); } } else { MessageBox.Show("Login Inválido !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning); loginTextBox.Clear(); loginTextBox.Focus(); } reader.Close(); } catch(Exception ex) { MessageBox.Show("Não foi Possível Entrar !" + ex.Message, "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
GOSTEI 0