VB .NET - Curso Prático ADO .NET - Módulo de Administração : Gerenciando Clientes - V


Nesta aula iremos criar o formulário de clientes e realizar as operações de manutenção da informações dos clientes cadastrados na CiaFilmes.

Criar, modificar e deletar objetos e aplicar estas alterações ao banco de dados é muito fácil com o Entity Framework. Através do Object Services que gerencia todas as alterações feitas nos objetos e gera e executa as instruções T-SQL que irão realizar as operações de inclusão, alteração  e exclusão contra a fonte de dados. Tudo isso é feito através da chamada do método SaveChanges do ObjectContext.

Vamos implementar as operações CRUD para gerenciar as informações do clientes usando os recursos do Entity Framework.

Criando o formulário de Clientes

Abrindo o projeto CiaFilmesWinAdmin no Visual Studio 2012 Express for desktop;

Vamos incluir um novo formulário no projeto. No menu PROJECT clique em Windows Forms informe o nome frmClientes.vb e clique no botão Add;

A seguir vamos definir as seguintes propriedades deste formulário:

A partir da ToolBox vamos incluir os seguintes controles neste formulário:

Disponha os controles conforme o leiaute da figura abaixo:

Vamos implementar as seguintes funcionalidades neste formulário:

Essas funcionalidades serão implementadas em praticamente todos os formulários do projeto para realizar as operações de seleção e persistência dos dados no banco de dados CiaFilmes.mdf. Por esse motivo eu vou explicar em detalhes a implementação feita neste formulário e nos demais ela será praticamente idêntica e eu vou somente mostrar o código não repetindo a explicação novamente.

Vamos usar os recursos do Entity Framework e do Entity Data Model gerado em nosso projeto. Você verá que é muito simples trabalhar com o modelo de entidades onde estaremos abstraindo os objetos ADO .NET e os comandos SQL.

Para implementar todas essas funcionalidades vamos utilizar o contexto CiaFilmesEntities que representa o nosso modelo de entidades gerado pelo EDM.

1- Localizando um Cliente

No evento Click do botão de comando que fica ao lado da caixa de texto Cliente ID vamos incluir o código para localizar um cliente cadastrado:

Private Sub btnLocalizarPorID_Click(sender As Object, e As EventArgs) Handles btnLocalizarPorID.Click


If
Not String.IsNullOrWhiteSpace(txtClienteID.Text) Then

    Dim codigo As Integer = Convert.ToInt32(txtClienteID.Text)

    Try

     Using ctxFilmes = New CiaFilmesEntities()

          Dim _cliente = ctxFilmes.Clientes.Find(codigo)

          txtNome.Text = _cliente.Nome

          txtSobrenome.Text = _cliente.Sobrenome

          txtCidade.Text = _cliente.Cidade

          cboEstados.Text = _cliente.Estado

          txtCep.Text = _cliente.Cep

          txtTelefone.Text = _cliente.Telefone

          txtEmail.Text = _cliente.Email

          dtpNascimento.Value = _cliente.Nascimento

          txtValidadeCartao.Text = _cliente.ValidadeCartao

          txtCartaoCredito.Text = _cliente.NumeroCartaoCredito

          txtCodSeguranca.Text = _cliente.CodigoSegurancaCartao

          txtLogin.Text = _cliente.Login

          txtSenha.Text = _cliente.Senha

       End Using

  Catch ex As Exception

   MessageBox.Show("Não existe registro com este critério : " & ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)

   End Try

Else

   MessageBox.Show("Informe o código do cliente. ", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)

End If

End Sub

Vamos entender o código.

Primeiro verificamos se o código informado é válido: 

  If Not String.IsNullOrWhiteSpace(txtClienteID.Text) Then

Se o código for informado a seguir convertemos o código para um inteiro e atribuímos à variável codigo:

 Dim codigo As Integer = Convert.ToInt32(txtClienteID.Text)

Iniciamos um bloco Try/Catch e criamos uma instância do nosso contexto:

  Using ctxFilmes = New CiaFilmesEntities()

A variável ctxFilmes representa o nosso contexto e a partir dela teremos acesso a todos os recursos do Entity Data Model.

Usamos usando a cláusula Using/End Using de forma que estamos usando o recurso e ao final ele será liberado.

A seguir criamos uma variável _cliente que é do tipo da entidade Cliente que que receberá o retorno obtido pelo método Find().

O método Find() que encontra uma entidade pelo valor de sua chave primária existente no contexto. No exemplo o valor da variável codigo representa a chave primária da entidade.

O método Find() usa o valor da chave primária para tentar encontrar uma entidade controlada pelo contexto. Se a entidade não for encontrada no contexto então uma consulta será enviada para a base de dados para encontrar a entidade. Se a entidade não for encontrada nem no contexto nem no banco de dados será retornado Null.

Usar o método Find() é diferente de usar uma consulta LINQ de duas maneiras importantes:

Dim _cliente = ctxFilmes.Clientes.Find(codigo)

Nota : Uma consulta LINQ obtendo o mesmo resultado seria semelhante a :

 
Dim _cliente = (From cli In ctxFilmes.Clientes Where cli.ClienteId = codigo Select cli).First
 

Com a entidade retornada atribuímos os valores de cada campo mapeado para as caixas de texto exibindo no formulário as informações do cliente para o código fornecido:

          txtNome.Text = _cliente.Nome

          txtSobrenome.Text = _cliente.Sobrenome

          txtCidade.Text = _cliente.Cidade

          cboEstados.Text = _cliente.Estado

          txtCep.Text = _cliente.Cep

          txtTelefone.Text = _cliente.Telefone

          txtEmail.Text = _cliente.Email

          dtpNascimento.Value = _cliente.Nascimento

          txtValidadeCartao.Text = _cliente.ValidadeCartao

          txtCartaoCredito.Text = _cliente.NumeroCartaoCredito

          txtCodSeguranca.Text = _cliente.CodigoSegurancaCartao

          txtLogin.Text = _cliente.Login

          txtSenha.Text = _cliente.Senha

 

Percebeu a simplicidade do código !!!! Basicamente cumprimos as seguintes etapas:

1- Criamos o contexto
2- Usamos o método Find (poderíamos ter usando uma consulta LINQ)
3- Obtemos o resultado esperado

Note que não precisamos instanciar nenhum objeto ADO .NET nem usar nenhum comando SQL.

2- Incluindo um Cliente

Para incluir um novo cliente basta digitar os dados diretamente nas caixas de texto do formulário e clicar no botão Incluir.

No evento Click do botão de comando Incluir vamos incluir o código para incluir um novo cliente:

Private Sub btnIncluir_Click(sender As Object, e As EventArgs) Handles btnIncluir.Click

 

 Try

     Dim _cliente As New Cliente

     _cliente.Nome = txtNome.Text

     _cliente.Sobrenome = txtSobrenome.Text

     _cliente.Cidade = txtCidade.Text

     _cliente.Estado = cboEstados.Text

     _cliente.Cep = txtCep.Text

     _cliente.Telefone = txtTelefone.Text

     _cliente.Email = txtEmail.Text

     _cliente.Nascimento = dtpNascimento.Value

     _cliente.ValidadeCartao = txtValidadeCartao.Text

     _cliente.NumeroCartaoCredito = txtCartaoCredito.Text

    _cliente.CodigoSegurancaCartao = txtCodSeguranca.Text

    _cliente.Login = txtLogin.Text

    _cliente.Senha = txtSenha.Text

    Using ctxFilmes = New CiaFilmesEntities()

        ctxFilmes.Clientes.Add(_cliente)

        ctxFilmes.SaveChanges()

    End Using

 Catch ex As Exception

   MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)

 End Try

End Sub

O código acima cria uma instância da entidade Cliente, gerada pelo EDM, e a seguir atualiza as propriedades da classe com os dados das caixas de texto do formulário.

Para incluir efetivamente o cliente na base de dados usamos o código:

Using ctxFilmes = New CiaFilmesEntities()

        ctxFilmes.Clientes.Add(_cliente)

        ctxFilmes.SaveChanges()

End Using

 

1- Onde criamos uma instância do contexto (CiaFilmesEntities);
2- Adicionamos a instância da entidade cliente ao contexto;
3- E usamos o método SaveChanges() para incluir a entidade no contexto e atualizar a base de dados;

Com 3 linhas de código fizemos uma inclusão no SQL Server usando o modelo de entidades.

Só para você sentir o drama veja a seguir o código usado para incluir um novo cliente na base de dados usando ADO .NET:

strConsulta = "INSERT INTO Clientes (Nome, Sobrenome, Endereco, Cidade,Estado, Cep, Telefone, Email, Nascimento, NumeroCartaoCredito, 
                      alidadeCartao,CodigoSegurancaCartao,Login,Senha) " _
                     & " VALUES(@Nome,@Sobrenome,@Endereco,@Cidade,@Estado,@Cep,@Telefone,@Email,@Nascimento,@NumeroCartaoCredito,
                     @ValidadeCartao,@CodigoSegurancaCartao,@Login,@senha)"
        'Declara um objeto CmdString para o objeto Command
        Dim CmdString As New SqlCommand(strConsulta, sqlCon)
        'Especifica a consulta armazeanda na variavel CmdString como a consulta a ser executada
        sqlAda.InsertCommand = CmdString
        'Define os parâmetros, seus tipos, tamanhos e valores 
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Nome", System.Data.SqlDbType.VarChar, 50, "Nome"))
        sqlAda.InsertCommand.Parameters(0).Value = txtNome.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Sobrenome", System.Data.SqlDbType.VarChar, 50, "Sobrenome"))
        sqlAda.InsertCommand.Parameters(1).Value = txtSobrenome.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Endereco", System.Data.SqlDbType.VarChar, 50, "Endereco"))
        sqlAda.InsertCommand.Parameters(2).Value = txtEndereco.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Cidade", System.Data.SqlDbType.VarChar, 50, "Cidade"))
        sqlAda.InsertCommand.Parameters(3).Value = txtCidade.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Estado", System.Data.SqlDbType.VarChar, 2, "Estado"))
        sqlAda.InsertCommand.Parameters(4).Value = cboEstados.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Cep", System.Data.SqlDbType.VarChar, 8, "Cep"))
        sqlAda.InsertCommand.Parameters(5).Value = txtCep.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Telefone", System.Data.SqlDbType.VarChar, 50, "Telefone"))
        sqlAda.InsertCommand.Parameters(6).Value = txtTelefone.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Email", System.Data.SqlDbType.VarChar, 100, "Email"))
        sqlAda.InsertCommand.Parameters(7).Value = txtEmail.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Nascimento", System.Data.SqlDbType.DateTime, 8, "Nascimento"))
        sqlAda.InsertCommand.Parameters(8).Value = Convert.ToDateTime(dtpNascimento.Text)
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@NumeroCartaoCredito", System.Data.SqlDbType.VarChar, 16, "NumeroCartaoCredito"))
        sqlAda.InsertCommand.Parameters(9).Value = txtCartaoCredito.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@ValidadeCartao", System.Data.SqlDbType.VarChar, 10, "ValidadeCartao"))
        sqlAda.InsertCommand.Parameters(10).Value = txtValidadeCartao.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@CodigoSegurancaCartao", System.Data.SqlDbType.VarChar, 10, "CodigoSegurancaCartao"))
        sqlAda.InsertCommand.Parameters(11).Value = txtCodSeguranca.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Login", System.Data.SqlDbType.VarChar, 50, "Login"))
        sqlAda.InsertCommand.Parameters(12).Value = txtLogin.Text
        sqlAda.InsertCommand.Parameters.Add(New SqlParameter("@Senha", System.Data.SqlDbType.VarChar, 50, "Senha"))
        sqlAda.InsertCommand.Parameters(13).Value = CifraDecifraSenha(txtSenha.Text)
        Try
            'estabelece uma conexão
            sqlCon.Open()
            'Executa a consulta
            sqlAda.InsertCommand.ExecuteNonQuery()
        Catch MyException As SqlException
            'tratamento de erros
             ...
            CmdString.Dispose()
            Return
        Finally
            'libera os recursos usados
            CmdString.Dispose()
            sqlCon.Dispose()
            sqlAda.Dispose()
            sqlCon.Close()
            Me.Close()
        End Try

3- Alterando dados do Cliente

Para alterar dados de um cliente cliente informamos o código de um cliente existente e localizamos a entidade no contexto exibindo as informações nos controles de formulário.

A seguir alteramos diretamente nas caixas de texto os valore desejados e clicamos no botão Alterar para persistir as alterações.

No evento Click do botão de comando Alterar vamos incluir o código para alterar os dados de um cliente:

Private Sub btnAlterar_Click(sender As Object, e As EventArgs) Handles btnAlterar.Click


 Try

     Dim codigo As Integer = Convert.ToInt32(txtClienteID.Text)

     Using ctxFilmes = New CiaFilmesEntities()

         Dim resultado = From cli In ctxFilmes.Clientes Where cli.ClienteId = codigo Select cli

         Dim _cliente As Cliente = resultado.First

         _cliente.Nome = txtNome.Text

         _cliente.Sobrenome = txtSobrenome.Text

         _cliente.Cidade = txtCidade.Text

         _cliente.Estado = cboEstados.Text

         _cliente.Cep = txtCep.Text

         _cliente.Telefone = txtTelefone.Text

         _cliente.Email = txtEmail.Text

         _cliente.Nascimento = dtpNascimento.Value

         _cliente.ValidadeCartao = txtValidadeCartao.Text

         _cliente.NumeroCartaoCredito = txtCartaoCredito.Text

         _cliente.CodigoSegurancaCartao = txtCodSeguranca.Text

         _cliente.Login = txtLogin.Text

         _cliente.Senha = txtSenha.Text

         ctxFilmes.SaveChanges()

     End Using

 Catch ex As Exception

    MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)

 End Try

End Sub

No código obtemos o valor do código do cliente informado na caixa de texto txtClienteID;

   Dim codigo As Integer = Convert.ToInt32(txtClienteID.Text)   (Seria bom validar para não permitir valores vazios...)

A seguir criamos uma instância do ObjectContext, representando por CiaFIlmesEntities, que foi criado no Entity Data Model e com ele temos acesso as entidades e aos recursos do Entity Framework.

   Using ctxFilmes = New CiaFilmesEntities()

A seguir usamos uma Consulta LINQ para retornar o cliente desejado;

    Dim resultado = From cli In ctxFilmes.Clientes Where cli.ClienteId = codigo Select cli

Usamos o operador First que retorna o primeiro elemento da seqüência que satisfaz o critério.

    Dim _cliente As Cliente = resultado.First

Atualizamos os dados na entidade Cliente :

          _cliente.Nome = txtNome.Text

         _cliente.Sobrenome = txtSobrenome.Text

         _cliente.Cidade = txtCidade.Text

         _cliente.Estado = cboEstados.Text

         _cliente.Cep = txtCep.Text

         _cliente.Telefone = txtTelefone.Text

         _cliente.Email = txtEmail.Text

         _cliente.Nascimento = dtpNascimento.Value

         _cliente.ValidadeCartao = txtValidadeCartao.Text

         _cliente.NumeroCartaoCredito = txtCartaoCredito.Text

         _cliente.CodigoSegurancaCartao = txtCodSeguranca.Text

         _cliente.Login = txtLogin.Text

         _cliente.Senha = txtSenha.Text

Persistimos as alterações no modelo de entidades e no banco de dados:

        ctxFilmes.SaveChanges()

Muito elegante e simples e ainda temos o recurso do Intellisense que permite detectar erros em tempo de desenvolvimento.

4- Excluindo um Cliente

Para excluir um cliente basta informar o código do cliente e localizar o cliente e a seguir clicar no botão Excluir.

No evento Click do botão de comando Excluir vamos incluir o código para excluir um cliente:

Private Sub btnExcluir_Click(sender As Object, e As EventArgs) Handles btnExcluir.Click
 

If (MessageBox.Show("Deseja excluir o item selecionado ?", "Excluir", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = Windows.Forms.DialogResult.Yes) Then

 Try

    Dim codigo As Integer = Convert.ToInt32(txtClienteID.Text)

    Using ctxFilmes = New CiaFilmesEntities()

      Dim resultado = From cli In ctxFilmes.Clientes Where cli.ClienteId = codigo

      If resultado.Count > 0 Then

       Dim _cliente As Cliente = resultado.First

         ctxFilmes.Clientes.Remove(_cliente)

         ctxFilmes.SaveChanges()

      Else

       MessageBox.Show("Não existe registro com este critério", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)

         Exit Sub

    End If

   End Using

 Catch ex As Exception

  MessageBox.Show(ex.Message() & " - " & ex.InnerException.ToString, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)

 End Try

End If

End Sub

O código apresenta uma solicitação de confirmação para excluir o cliente.

A seguir obtemos o valor do código do cliente informado na caixa de texto txtClienteID;

   Dim codigo As Integer = Convert.ToInt32(txtClienteID.Text)   (Seria bom validar para não permitir valores vazios...)

A seguir criamos uma instância do ObjectContext, representando por CiaFIlmesEntities, que foi criado no Entity Data Model e com ele temos acesso as entidades e aos recursos do Entity Framework.

   Using ctxFilmes = New CiaFilmesEntities()

A seguir usamos uma Consulta LINQ para retornar o cliente desejado;

    Dim resultado = From cli In ctxFilmes.Clientes Where cli.ClienteId = codigo

A seguir verificamos se a entidade foi localizada no contexto;

    If resultado.Count > 0 Then

Usamod o operador First que retorna o primeiro elemento da seqüência que satisfaz o critério.

     Dim _cliente As Cliente = resultado.First

Usamos o método Remove para remover a entidade do contexto;

    ctxFilmes.Clientes.Remove(_cliente)

Persistimos as alterações no modelo de entidades e no banco de dados:

    ctxFilmes.SaveChanges()

Dessa forma, usando o Entity Framework, vimos como implementar as operações CRUD e concluímos que precisamos de muito pouco código para fazer isso, além disso, o código fica mais limpo e fácil de entender.

 

Na próxima aula iremos ver mais detalhes de operações envolvendo o acesso e a atualização do banco de dados CiaFilmes.

      Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti