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 = 3A 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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#