terça-feira, 23 de abril de 2013

Formulário de Login - Básico


Hoje postaram uma dúvida no forúm da MSDN sobre controle de Login. E eu achei interessante postar aqui uma forma simples de se criar uma tela de login.

Esse exemplo é em WindowsForms.

Primei eu adicionei os seguintes controles:
  • Label – Usuário e Senha
  • TextBox – Usuário e Senha
  • Button – Login


Os nomes dos controles ficaram:


  • TxtUsuario
  • TxtSenha
  • BtnLogin

O form ficou dessa maneira:



No evento Click do botão Login entrei com o seguinte código:
private void BtnLogin_Click(object sender, EventArgs e)
{
    if (txtUsuario.Text != string.Empty && txtSenha.Text != string.Empty)
    {

if (ExecutaLogin(txtUsuario.Text, txtSenha.Text))
{
    MessageBox.Show("Bem Vindo");
}
else
{
    MessageBox.Show("Usuário ou senha inválida");
}
    }
}

Acima eu estou verificando se o usuário preencheu os campos, se sim, eu executo a função: ExecutaLogin(string, string), veja o código:
private bool ExecutaLogin(string usuario, string senha)
{

    bool ok = false;

    SqlConnection cnnBase = new SqlConnection(ControleLogin.Properties.Settings.Default.Conexao);
    SqlCommand cmd = new SqlCommand("select nome from usuario where login=@usuario and senha=@senha", cnnBase);
    cmd.CommandType = CommandType.Text;

    cmd.Parameters.Add("@usuario", SqlDbType.VarChar).Value = usuario;
    cmd.Parameters.Add("@senha", SqlDbType.VarChar).Value = senha;

    SqlDataAdapter da = new SqlDataAdapter(cmd);

    DataTable dt = new DataTable();

    da.Fill(dt);

    da.Dispose();
    cmd.Dispose();
    cnnBase.Close();

    if (dt.Rows.Count == 1)
    {
return true;
    }
    else
    {
return false;
    }
    return ok;

}
O que esta sendo feito nessa função, nessa função eu utilizo 4 variáveis diferentes, são elas:
  • cnnBase -  é a conexão com o meu banco de dados, a connectionString  eu criei no App.Config. assim eu posso centralizar e acessar de qualquer ponto do sistema.
  • cmd – é o comando que será executado pelo SQL, no meu caso uma consulta.
  • da – é o retorno da minha consulta
  • dt – é o resultado transformado da minha consulta em uma tabela.

Repare que eu não estou concatenando os valores que o usuário passou  ao comando SQL que será executado. Isso porque o usuário pode inserir alguns códigos e quebrar o resultado do SQL, isso é chamado de SqlInjection. Por isso eu estou adicionado como parâmetro e informando qual é o tipo de dado que estou passando.

Eu coloquei um IF retornando como ok somente se o retorno for igual a um, pois se o resultado contiver mais de um registro ou não retornar nada, o retorno tem que ser falso.

Ao executar e digitar o usuário correto, o resultado será esse:


Digitando o usuário errado e a senha correta:



6 comentários:

  1. Muito bom, poderia mostrar como criou a conexão no App.config?

    ResponderExcluir
    Respostas
    1. https://programandodotnet.files.wordpress.com/2011/11/connectionstring.jpg?w=960

      Excluir
  2. SqlConnection(ControleLogin.Properties.Settings.Default.Conexao);

    Me mostra que não existe ControleLogin, pode me explicar o porque?

    ResponderExcluir
    Respostas
    1. Olá, controlelogin é o nome do Projeto em si, se você criou o projeto com outro nome, teria que usar esse nome que vocÊ deu.

      Excluir
  3. como retorno uma registro do dataTable?

    ResponderExcluir
    Respostas
    1. Olá, você tem o Rows dentro de datatable, ele tem o retorno de todas as linhas do seu select.
      então ficaria da seguinte forma:
      dt.Rows[Linha][Coluna];
      onde linha é a linha de retorno do seu select. e coluna é qual coluna você quer a informação. lembrando que os dois índices começam no 0.

      dt.Rows[0][0];

      Excluir