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