 VB 
2005 - Acesso e manutenção de dados II
VB 
2005 - Acesso e manutenção de dados II
Em meu primeiro artigo VB 2005 - Acesso e manutenção de dados para iniciantes meu objetivo foi mostrar como criar uma aplicação bem básica para Cadastro de clientes de forma que os que estão iniciando no VB .NET possam acompanhar.
Não é por que você esta iniciando que terá que usar somente os assistentes para criação de aplicações. Você pode usá-los, e , em certa ocasiões é até recomendável fazê-lo mas geralmente eles nunca vão fazer o trabalho melhor do que você.
Desde modo no primeiro artigo eu apresentei o problema , criei um projeto no VB 2005 Express , criei o banco de dados e a tabela , defini a string de conexão e no momento de usar o assistente preferi mostrar como você mesmo pode tomar as rédeas da aplicação e criar o código necessário para realizar as tarefas de inclui, alterar , excluir e consultar dados.
Então apenas para relembrar chegamos ao ponto de criar o formulário da aplicação conforme o leiaute abaixo:

O que pretendemos é o seguinte:
- Quando a aplicação for iniciada será apresentando o formulário conforme a figura acima. Não iremos carregar a ListBox com os nomes dos clientes. Poderíamos fazer isso sem problemas mas não vamos fazê-lo por um questão de desempenho, pois se o cadastro possuir 100 registros o desempenho será mas se o cadastro tiver 100.000 o desempenho será bem menor. Deste modo eu estou disponibilizando uma caixa de texto e um botão de comando acima da ListBox para que o usuário efetue uma busca na base de dados e assim eu só vou trazer os registros referentes aos critérios realizados nesta busca.
Assim o usuário poderá solicitar um nome parcial e serão trazidos todos os clientes que atendem ao critério. Veja abaixo o exemplo onde o usuário digitou as letras Jo e clicou no botão de busca . Foram encontrados somente dois clientes cujo nome continham as palavras Jo e eles foram exibidos no ListBox. Atendemos ao cliente e a aplicação ficou bem rápida na do formulário.

Quando o usuário selecionar um cliente os dados serão exibidos nos controles a direita para que o usuário tenha uma visão geral do cliente. Note que o código do cliente - ClienteId - não é passível de alteração e não esta acessível.
Desta forma o usuário poderá , após selecionar o cliente , incluir, alterar e excluir um registro da tabela. Vamos agora mostrar como fizemos a implementação destas funcionalidades.
No evento Load do formulário da aplicação chamamos a rotina calculaNumeroRegistros() que irá calcular quantos registros existem gravados na tabela Clientes.
| Private
    Sub Form1_Load(ByVal 
    sender As 
    System.Object, ByVal 
    e As System.EventArgs)
    Handles 
    MyBase.Load calculaNumeroRegistros()End Sub | 
A rotina possui o seguinte código:
| PrivateSub calculaNumeroRegistros() Dim strConn As String = My.Settings.CadastroConnectionString.ToString() Dim strSQL As String = "Select Count(*) From Clientes" 'define objeto connection e command Dim con As New SqlConnection(strConn) Dim cmd As New SqlCommand(strSQL, con) 
 lblNumeroRegistros.Text ="Clientes Cadastrados: " & cmd.ExecuteScalar.ToString Catch ex As Exception MsgBox("Erro ao calcular numero de registros. Erro : " & ex.Message) Finally con.Close()End Try End Sub | 
Esta rotina funciona assim:
Isso é tudo.
Agora vejamos como é feita a consulta aos clientes
No evento Click da caixa de texto txtProcuraClientePorNome.text temos o seguinte código:
| PrivateSub btnProcuraClientePorNome_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcuraClientePorNome.Click If txtProcuraClientePorNome.Text.Trim.Length > 1 Then 
 
 lstbClientes.DataSource = da.GetDataByNome("%" & txtProcuraClientePorNome.Text & "%") lstbClientes.DisplayMember ="nome" lstbClientes.ValueMember ="clienteID" lstbClientes.Refresh()Else ErrorProvider1.SetError(txtProcuraClientePorNome,"Informe o nome do cliente com no mínimo 2 caracteres...") End If End Sub | 
Nesta rotina temos:
Nesta altura preciso mostrar como foi criada a consulta GetDataByNome().
- Clicamos no dataset - CadastroDataSet.xsd;
- Clicamos com o botão direito do mouse sobre o ClientesTableAdapter e 
selecionamos a opção Add Query;
- Na janela Choose a Command Type , marcamos Use SQL Statements;
- Na janela Choose a Query Type , marcamos SELECT Whichs returns rows;
- A seguir na janela Specify a SELECT statement definimos a instrução SQL 
: SELECT clienteID, nome FROM Clientes WHERE (nome LIKE @Param)
|  | 
- Definimos o nome da consulta como GetDataByNome conforme abaixo:

Agora quando o usuário clicar em um dos clientes apresentados na ListBox seus dados serão apresentados no formulário.
Para isso usamos o evento SelectedIndexChanged do controle ListBox e incluímos o seguinte código neste evento;
| Private
    Sub 
    lstbClientes_SelectedIndexChanged(ByVal 
    sender As 
    Object, 
    ByVal e 
    As System.EventArgs)
    Handles 
    lstbClientes.SelectedIndexChanged
    If (lstbClientes.SelectedValue.ToString() 
    <> "System.Data.DataRowView")
    Then carregaClientes(CInt(Me.lstbClientes.SelectedValue)) End If End Sub | 
A rotina carregaClientes é quem irá obter os dados do cliente e exibir nos controles do formulário. Seu código é o seguinte:
| PrivateSub carregaClientes(ByVal clienteID As Integer) Dim strConn As String = My.Settings.CadastroConnectionString.ToString() Dim strSQL As String = "Select * from Clientes Where clienteID = " & clienteID Dim dr As SqlDataReader 'define objeto connection e command Dim con As New SqlConnection(strConn) Dim cmd As New SqlCommand(strSQL, con) Try con.Open() dr = cmd.ExecuteReader 
        
    dr.Read() ClienteIDTextBox.Text = dr("clienteID").ToString NomeTextBox.Text = dr("nome").ToString EnderecoTextBox.Text = dr("endereco").ToString CidadeTextBox.Text = dr("cidade").ToString EstadoTextBox.Text = dr("estado").ToString CepTextBox.Text = dr("cep").ToString TelefoneTextBox.Text = dr("telefone").ToString EmailTextBox.Text = dr("email").ToString sexoTextBox.Text() = dr("sexo").ToString NascimentoDateTimePicker.Text = dr("nascimento").ToString End If Catch ex As Exception MsgBox("Erro ao obter dados dos clientes. Erro : " & ex.Message) Finally con.Close()End Try End Sub | 
Vejamos a seguir o código para as operações de incluir, Alterar e excluir:
- Incluir
O código para incluir dados na tabela deve ser inserido no evento Click do botão de comando Incluir:
|  Private Sub btnIncluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIncluir.Click
        Dim msg As String = ""
        Dim sql As String = ""
        Dim strConn As String = My.Settings.CadastroConnectionString.ToString()        If btnIncluir.Text = "Incluir" Then
            btnIncluir.Text = "Salvar"
            lstbClientes.Enabled = False
            limpaControles(Me)
            NomeTextBox.Focus()
        ElseIf btnIncluir.Text = "Salvar" Then
            If valida() Then
                sql = "INSERT INTO Clientes (nome, endereco, cidade, estado, cep, telefone, email, sexo, nascimento) VALUES('" _
                                            + NomeTextBox.Text + "','" _
                                            + EnderecoTextBox.Text + "','" _
                                            + CidadeTextBox.Text + "','" _
                                            + EstadoTextBox.Text + "','" _
                                            + CepTextBox.Text + "','" _
                                            + TelefoneTextBox.Text + "','" _
                                            + EmailTextBox.Text + "','" _
                                            + sexoTextBox.Text + "','" _
                                            + NascimentoDateTimePicker.Text + "')"                Dim con As New SqlConnection(strConn)
                Dim cmd As New SqlCommand(sql, con)
                Try
                    con.Open()
                    cmd.ExecuteNonQuery()
                    MsgBox("Cliente incluido com sucesso.")
                    btnIncluir.Text = "Incluir"
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
                lstbClientes.Enabled = True
            Else
                MsgBox("Dados incompletos.")
                lstbClientes.Enabled = True
                btnIncluir.Text = "Incluir"
            End If
        End If
    End Sub
 | 
Neste código obtemos a conexão e através da instrução SQL INSERT INTO , incluímos os novos dados na tabela Clientes.
- Alterar
No evento Click do botão Alterar temos o código que altera dados da tabela através da instrução SQL UPDATE / SET;
| Private Sub btnAlterar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAlterar.Click         If lstbClientes.SelectedIndex <> -1 Then
            Dim sql As String = ""
            Dim strConn As String = My.Settings.CadastroConnectionString.ToString()
            If valida() Then
                sql = "UPDATE Clientes SET nome       = '" + NomeTextBox.Text _
                                      + "',endereco   = '" + EnderecoTextBox.Text _
                                      + "',cidade     ='" + CidadeTextBox.Text _
                                      + "',estado     = '" + EstadoTextBox.Text _
                                      + "',cep        = '" + CepTextBox.Text _
                                      + "',telefone   = '" + TelefoneTextBox.Text _
                                      + "',email      ='" + EmailTextBox.Text _
                                      + "',sexo       = '" + sexoTextBox.Text _
                                      + "',nascimento = '" + NascimentoDateTimePicker.Text + "'" _
                                      + " WHERE clienteID = " + lstbClientes.SelectedValue.ToString                'define objeto connection e command
                Dim con As New SqlConnection(strConn)
                Dim cmd As New SqlCommand(sql, con)
                Try
                    con.Open()
                    cmd.ExecuteNonQuery()
                    MsgBox("Cliente alterado com sucesso.")
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Else
                MsgBox("Dados incompletos")
            End If
        Else
            MsgBox("Selecione um cliente para alterar.")
        End If
    End Sub
 | 
- Excluir
O código para excluir registros usando a instrução SQL DELETE FROM é mostrada a seguir;
| Private Sub btnExcluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExcluir.Click
        If lstbClientes.SelectedIndex <> -1 Then
            Dim sql As String = ""
            Dim strConn As String = My.Settings.CadastroConnectionString.ToString()            If MsgBox("Confirma a exclusão do cliente de codigo igual a " + lstbClientes.SelectedValue.ToString, MsgBoxStyle.YesNo) = MsgBoxResult.Yes Thensql = "DELETE FROM Clientes WHERE clienteID = " + lstbClientes.SelectedValue                 'define objeto connection e command
                Dim con As New SqlConnection(strConn)
                Dim cmd As New SqlCommand(sql, con)
                Try
                    con.Open()
                    cmd.ExecuteNonQuery()
                    MsgBox("Cliente excluído com sucesso.")
                    btnIncluir.Text = "Excluir"
                Catch ex As Exception
                    MsgBox("Não foi possível excluir o cliente." + vbCrLf + ex.Message)
                End Try
            End If
        Else
            MsgBox("Selecione um cliente para excluir.")
        End If
    End Sub
 | 
A rotina valida() que efetua a validação dos dados informados pelo usuário é mostrada abaixo:
| Private 
    Function valida()
    As 
    Boolean
    
    
    'verifica se algumas 
    informações foram fornecidas
    
    
    If NomeTextBox.Text =
    String.Empty
    Or 
    EnderecoTextBox.Text = String.Empty
    Or CidadeTextBox.Text 
    = String.Empty
    Or EstadoTextBox.Text 
    = String.Empty
    Or CepTextBox.Text 
    = String.Empty
    Then Return False Else Return True End If End Function | 
Com isso você tem as funcionalidades básicas de manutenção de dados implementadas via código sem a utilização dos assistentes do Windows.
Se você chegou até aqui, compreendeu o que foi feito , e entendeu as rotinas envolvidas nas implementações das funcionalidades , podemos dizer que você evoluiu e deixou o estágio de dependência dos assistentes.
Podemos dizer então que atingimos a perfeição ,e, que a aplicação desenvolvida desta forma pode ser considerada robusta, fácil de manter e portar ?
Sinceramente , estamos longe deste estágio ainda...
Sejamos sinceros , se formos um pouco mais exigentes com nosso código veremos que ele é prolixo, difícil de manter de portar e de entender e que vamos ter que melhorar para atingir um nível mais elevado de refinamento.
Embora você tenha evoluído eu lhe mostrarei um caminho mais perfeito no próximo artigo onde estaremos alterando nossa aplicação para trabalhar em camadas separando assim as regras de negócio e o acesso aos dados da camada de apresentação. Vamos remover o código dos formulários tornando-o mais enxuto.
Pegue a aplicação desse estágio aqui: Cadastro1.zip (sem a base de dados)
Até o próximo artigo ...
referências:
José Carlos Macoratti