VB .NET - Curso Prático ADO .NET - Módulo de Administração : Criando o formulário de Login - III


Vamos continuar o nosso curso prático sobre ADO .NET usando a linguagem VB .NET onde na primeira parte desenvolvemos uma pequena aplicação para uma revenda de filmes e agora estamos desenvolvendo o módulo de administração do sistema.

Nesta aula iremos criar o formulário de login da aplicação.

Criando o formulário de Login

Abra o projeto CiaFilmesWinAdmin criado na aula anterior no Visual Studio 2012 Express for desktop;

Vamos renomear o formulário form1.vb para frmLoginAdmin.vb e vamos incluir no formulário a partir da ToolBox os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

Ao iniciar o projeto será apresentado o formulário de login para que o usuário informe seu nome e senha. Após 3 tentativas, com informação de dados incorretos, a aplicação será fechada.

No formulário frmLoginAdmin.vb vamos declarar a variável tentativas que irá controlar o número de tentativas do usuário:

Dim tentativas As Integer = 3

A seguir no evento Click do botão OK temos o código que verifica as credenciais do usuário :

Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
        'verifica se o o usuário informou o login e senha válidos
        If String.IsNullOrEmpty(txtLogin.Text) Or txtLogin.Text.Length < 5 Then
            MessageBox.Show("Informe um Login válido !", "Login", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txtLogin.Focus()
            Return
        End If
        If String.IsNullOrEmpty(txtSenha.Text) Or txtSenha.Text.Length < 5 Then
            MessageBox.Show("Informe uma senha válida !", "Senha", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txtSenha.Focus()
            Return
        End If
        Try
            Using ctxFilmes = New CiaFilmesEntities()
                Dim _usuario = From usu In ctxFilmes.Usuarios
                               Where usu.Login = txtLogin.Text And usu.Senha = txtSenha.Text
                               Select usu
                If _usuario.Count > 0 Then
                    Dim resultado = _usuario.First
                    txtLogin.Clear()
                    txtSenha.Clear()
                    Me.Hide()
                    usuarioPerfil = resultado.Perfil.ToString.Trim
                    My.Forms.frmMenuAdmin.ShowDialog()
                Else
                    'decrementa o numero de tentativas
                    tentativas -= 1
                    'se zerou as tentativas então encerra
                    If tentativas = 0 Then
                        MessageBox.Show("Número de tentativas foi excedido. A aplicação será encerrada !", "Login", MessageBoxButtons.OK,
 MessageBoxIcon.Exclamation)
                        'Fecha aplicação
                        Application.Exit()
                    Else
                        'limpa as caixas de texto
                        txtLogin.Clear()
                        txtSenha.Clear()
                        MessageBox.Show("Login e/ou senha inválida ! Você tem mais " & tentativas.ToString & " tentativa(s).", "Login", 
MessageBoxButtons.OK, MessageBoxIcon.Error)
                        txtLogin.Focus()
                        Return
                    End If
                End If
            End Using
        Catch ex As Exception
            MessageBox.Show(ex.Message() & ex.InnerException.ToString, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Primeiro verificamos se as informações do nome do usuário e senha não estão vazias ou com tamanho menor que 5 caracteres.

If String.IsNullOrEmpty(txtLogin.Text) Or txtLogin.Text.Length < 5 Then
            MessageBox.Show("Informe um Login válido !", "Login", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txtLogin.Focus()
            Return
        End If
If String.IsNullOrEmpty(txtSenha.Text) Or txtSenha.Text.Length < 5 Then
            MessageBox.Show("Informe uma senha válida !", "Senha", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txtSenha.Focus()
            Return
 End If

Após isso começamos a usar os recursos do Entity Framework no trecho de código mostrado a seguir:

Using ctxFilmes = New CiaFilmesEntities()

                Dim _usuario = From usu In ctxFilmes.Usuarios
                               Where usu.Login = txtLogin.Text And usu.Senha = txtSenha.Text
                               Select usu

                If _usuario.Count > 0 Then
                    Dim resultado = _usuario.First
                    txtLogin.Clear()
                    txtSenha.Clear()
                    Me.Hide()
                  
  usuarioPerfil = resultado.Perfil.ToString.Trim
                    My.Forms.frmMenuAdmin.ShowDialog()

                Else
                       ......
                        'Fecha aplicação
                        Application.Exit()
                    Else
                        'limpa as caixas de texto
                       .......

                        txtLogin.Focus()
                        Return
                    End If
                End If
 End Using

Estamos usando a instrução Using e criando uma nova instância do contexto CiaFilmesEntities() para ter acesso às entidades geradas no EDM.

Using ctxFilmes = New CiaFilmesEntities()

Nota: A instrução Using foi copiada do C# e é usada para facilitar a implementação de executar código para liberá-lo após sua utilização.

A seguir estamos usando uma consulta LINQ para verificar se o usuário e a senha existem na tabela Usuarios.

Dim _usuario = From usu In ctxFilmes.Usuarios
                       Where usu.Login = txtLogin.Text And usu.Senha = txtSenha.Text
                       Select usu

A consulta LINQ lembra uma consulta SQL. Percebemos a utilização das cláusulas From, Where e Select

Perceba também que a lógica da declaração esta invertida em relação a usada na linguagem SQL.

SQL  Select usu From ctxFilmes.Usuarios
LINQ  From usu in ctxFilmes.Usuarios Where ... Select usu

Um dos motivos desta inversão de ordens é  o uso recurso IntelliSense, pois quando você indica primeiro a origem dos dados ele pode mostrar as listas de membros de tipos nos objetos em sua coleção. Outro motivo , segundo Anders Hejlsberg , seria que esta ordem esta mais próxima da nossa lógica de pensamento. Quando você digita uma instrução SQL iniciando com Select na verdade você já esta pensando na origem dos dados , condições , agrupamentos. etc.

A cláusula From é a mais importante do LINQ To SQL pois é usada em todas as consultas. Uma consulta deve sempre começar com From. (O Select pode estar implícito o From não.)

Esta consulta irá retornar um único usuário que possua as credenciais cadastradas no banco de dados CiaFilmes.

O código a seguir verifica se foi retornado pelo menos um usuário, e, em caso positivo obtém o usuário e extrai a informação do seu perfil, abrindo em seguida o formulário principal da aplicação : frmMenuAdmin

  If _usuario.Count > 0 Then
        Dim resultado = _usuario.First
        txtLogin.Clear()
        txtSenha.Clear()
        Me.Hide()
        usuarioPerfil = resultado.Perfil.ToString.Trim
     
  My.Forms.frmMenuAdmin.ShowDialog()
       ......

Perceba que não precisamos instanciar objetos Connection, Command, DataAdapter, DataSet, etc., nem usar instruções SQL para consultar as informações no banco de dados.

Agora estamos trabalhando com entidades e com consultas LINQ usando um nível de abstração onde os objetos ADO .NET e comandos SQL são transparentes para ao desenvolvedor. (Na verdade por trás dos panos eles estão atuando)

Dessa forma a quantidade de código diminuiu e ganhamos em robustez também pois o código usado tem o recurso Intellisense que permite em tempo de desenvolvimento verificar erros

O código do evento Click do botão Cancelar apenas solicita a confirmação do usuário para encerrar a aplicação:

Private Sub btnCancela_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancela.Click

        If (MessageBox.Show("Confirma o encerramento da aplicação ? ", "Encerrar", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = 
Windows.Forms.DialogResult.Yes) Then
            Me.Close()
        End If

 End Sub

Eu estou usando o Entity Data Model criado pelo Entity Framework na camada de apresentação. O correto seria criar uma camada de acesso a dados e nesta camada gerar o EDM separando assim as responsabilidades, mas como o curso é nível básico e estamos introduzindo o Entity Framework para tornar o entendimento mais fácil para quem esta iniciando optei por essa implementação.

Nota: Para ver um exemplo com Entity Framework em camadas veja o artigo: C# - Cadastro de Clientes com Entity Framework em Camadas

Na próxima aula vou criar o formulário de menu da aplicação definindo as opções para manutenção dos dados e consultas do sistema.

      Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti