VB.NET - Acessando banco de dados, incluindo, alterando e excluindo com classes


Novamente vou mostrar como você pode acessar dados no VB.NET implementando as funcionalidades de inclusão , alteração e exclusão de dados. Embora eu já tenha abordado este assunto em artigos anteriores, neste artigo veremos uma forma diferente de fazer estas operações separando o em camadas. Assim, na camada de apresentação , os formulários,  teremos o código que chama os métodos criados em uma classe , com isto facilitamos a manutenção e a escalabilidade da nossa aplicação.

Veja os links abaixo para outras aplicações completas com acesso a dados no VB.NET:

O objetivo deste artigo é ensinar você a :

A aplicação terá como objetivo principal a manutenção dos dados dos alunos de uma escola hipotética. Teremos um banco de dados Access chamado Escola.mdb e neste banco de dados a tabela Alunos com  a seguinte estrutura:

    Nossa aplicação terá as seguintes funcionalidades:
  • Carregar dados da tabela
  • Exibir detalhes de um Aluno - permitindo alterar dados dos alunos
  • Incluir um novo Aluno na tabela
  • Excluir um aluno da tabela

A estrutura da nossa solução será a seguinte :

 Temos uma solução chamada - Escola e dois projetos:
  1. Escola - contendo os formulários :
    • frmPrincipal.vb - É o formulário principal que apresenta as opções do sistema
    • frmAluno.vb - É o formulário que irá exibir os detalhes e que será usado como base para criar formulários para incluir um novo aluno
  2. EscolaDados - contendo a classe EscolaDados.vb com os seguintes métodos que serão usados nos formulários:
    • getAluno
    • getAlunos
    • GetNovoAluno
    • SalvaAluno
    • SalvaAlunos
    • getConnection

Os dois formulários da aplicação estão exibidos abaixo:

O formulário principal da aplicação é o formulário frmPrincipal.vb que será carregado quando a aplicação for executada. Vejamos o código deste formulário:

 1- Código do evento Load do formulário :

 Private Sub frmPrincipal_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        btnExibeDetalhes.Enabled = False
        btnDeletar.Enabled = False
        btnNovo.Enabled = False
    End Sub

2- Código do evento Click do botão de comando - Carrega Dados  - do formulário :

Private Sub btnCarregaDados_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCarregaDados.Click
        Try
            'carrega dados da tabela no dataset
            Me.CarregaDados()
            'habilita os botoes do formulário principal habilitados
            btnExibeDetalhes.Enabled = True
            btnDeletar.Enabled = True
            btnNovo.Enabled = True
        Catch ex As Exception
            'mensagem de erro
            MsgBox("Erro a carregar dados da tabela." & vbCrLf & ex.Message)
        End Try
    End Sub

 3- Código do evento click do botão de comando - Exibe Detalhes - do formulário :

 Private Sub btnExibeDetalhes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExibeDetalhes.Click

        'define um CurrencyManager
        Dim cm As CurrencyManager

        'verifica se o dataset é nulo
        If IsNothing(dsAlunos) Then Exit Sub
        'faz a conversão explicita para o CurrencyManager do dataset
        cm = CType(BindingContext(dsAlunos, "alunos"), CurrencyManager)
        'obtem o ID do aluno
        Dim id As Integer
        Dim dr As DataRowView = CType(cm.Current, DataRowView)
        id = CType(dr.Item("ID"), Integer)
        'obtem o aluno selecionado pelo ID através do método getAluno()
        Dim dsAluno As DataSet = EscolaDados.EscolaDados.DataModule.GetAluno(id)

        'cria um formulário do tipo frmALuno e exibe os dados
        Dim frm As New frmAluno
        frm.frmPrincipal = Me   ' define a referencia para este form, permite chamar a função CarregaDados
        frm.carregaDados(dsAluno)
        frm.Show()
    End Sub

 

 4- Código do evento click do botão de comando - Novo - do formulário :

 Private Sub btnNovo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNovo.Click

        'obtem o aluno selecionado
        Dim dsAluno As DataSet = EscolaDados.EscolaDados.DataModule.GetNovoAluno

        'cria um novo objeto formulário com base em frmAluno 
        Dim frm As New frmAluno
        frm.frmPrincipal = Me   ' define a referencia para este form, permite chamar a função CarregaDados
        'inclui um titulo no formulário novo
        frm.Text = "Novo Aluno"
        'carrega o dataset com os dados do aluno
        frm.carregaDados(dsAluno)
        'exibe o formulario
        frm.Show()
    End Sub

 

5- Código do evento click do botão de comando - Novo - do formulário :

 Private Sub btnDeletar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeletar.Click

        'cria um objeto currencyManager
        'a classe gerencia uma lista de objetos vinculados
        Dim cm As CurrencyManager

        'verifica se o dataset esta vazio
        'isNothing - retorna um valor booleano indicando se a expressão possui ou nao um objeto associado a ela
        If IsNothing(dsAlunos) Then Exit Sub

        'converte o dataset para o tipo currencyManager
        'cType - retorna o resultado da conversão explicita para um tipo de dado especificado
        cm = CType(BindingContext(dsAlunos, "alunos"), CurrencyManager)

        'obtem a linha atual do currencyManager
        Dim dr As DataRow = CType(cm.Current, DataRowView).Row

        'exibe a mensagem para excluir o aluno e salvar as alterações
        If MsgBox("Confirma exclusão do aluno : " + GetNomeDoDataRow(dr) + "?", MsgBoxStyle.OKCancel, "Escola") = _
              MsgBoxResult.OK Then
            'delete a linha do dataset
            '(um datarow representa uma linha em um datatable)
            dr.Delete()

            'obtem os dados alterados e salva as alterações
            'getChanges - obtem uma copia do dataset contendo todas as 
            'alteracoes feitas deste a ultima vez que foi carregado ou 
            'da última chamada do AcceptChanges
            Dim dsChanged As DataSet = dsAlunos.GetChanges
            EscolaDados.EscolaDados.DataModule.SalvaAlunos(dsAlunos)
        Else
            'reseta o dataset e rejeita as alterações
            'rejectChanges - rejeita todas as alterações feitas na linha
            ' desde a ultima chamada de acceptChanges
            dsAlunos.RejectChanges()
        End If

    End Sub

6- Código da fuinção GetNomeDoDataRow() onde um datarow é passado como parâmetro

Private Function GetNomeDoDataRow(ByVal dr As DataRow) As String

        ' pega onome do aluno de um datarow permtindo nulls
        Dim resultado As String
        'verifica se o nome e o sobrenome são null e converte explicitamente os valores 
        'concatenando na string resultado
        'isNull é a propriedade que retorna o valor que indica se uma coluna contem um valor null
        If Not dr.IsNull("Nome") Then
            resultado = CType(dr.Item("nome"), String) + " "
        End If

        If Not dr.IsNull("Sobrenome") Then
            resultado += CType(dr.Item("Sobrenome"), String)
        End If

        'retorna o resultado
        Return resultado
    End Function

 

O código esta comentado com explicações sobre cada linha de comando. Se você perceber todas estas rotinas métodos definidos na classe EscolaDados.

Abaixo temos o código completo desta classe:

Public Class EscolaDados

    'defina as variaveis para o caminho do banco de dados
    Dim mCaminhoDados As String
    'define um membro compartilhado(shared) do tipo da classe EscolaDados
    Public Shared DataModule As EscolaDados
  
   Private Function GetConnection() As OleDb.OleDbConnection
        'retorna uma nova conexão com o banco de dados
        Return New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & mCaminhoDados & "\Escola.mdb")
    End Function

    Public Overloads Function GetAlunos() As DataSet
        'retorna um dataset representando os alunos 
        Return Me.GetAlunos("ID")
     End Function
 
    Public Overloads Function GetAlunos(ByVal campoOrdem As String) As DataSet

        'obtem a conexao com o banco de dados
        Dim conn As OleDb.OleDbConnection = GetConnection()
        Try
            'cria o dataset novo
            Dim ds As New DataSet
            'define a string sql para selecionar os alunos da tabela alunos ordenados pelo campo definido
            Dim sql As String = "select Nome,Sobrenome,id from alunos order by " + campoOrdem
            'cria um dataadapter para preencher o dataset
            Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(sql, conn)

            Try
                'preenche o dataset com os dados da tabela alunos
                da.Fill(ds, "alunos")
            Finally
                'libera recursos
                da.Dispose()
            End Try
            'retorna o dataset gerado
            Return ds
        Finally
            'estes comandos SEMPRE serão executados pois estao no bloco finally
            'fecha a conexão e libera objetos
            conn.Close()
            conn.Dispose()
        End Try
    End Function
 
    Public Function GetAluno(ByVal id As Integer) As DataSet

        'Retorna um datset repesentando um único aluno identificado pelo ID passado como parametro
        Dim conn As OleDb.OleDbConnection = GetConnection()

        Try
            'cria uma string sql para selecionar o aluno pelo id
            Dim sql As String = "Select * from alunos where id = " & id.ToString
            'cria um dataadapter para ser usado com o dataset
            'um dataadapter representa um conjunto de comandos e uma conexão usada
            ' para preencher um dataset e atualizar a fonte de dados
            Dim sa As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(sql, conn)
            Dim ds As New DataSet

            Try
                'preenche o dataset com os dados da tabela alunos
                sa.Fill(ds, "alunos")
            Finally
                'estes comandos SEMPRE serão executados pois estao no bloco finally
                'libera o dataadapter 
                sa.Dispose()
            End Try
            'retorna o dataset gerado com os dados do aluno selecionado
            Return ds

        Finally
            'estes comandos SEMPRE serão executados pois estao no bloco finally
            'fecha a conexão e libera o recursos
            conn.Close()
            conn.Dispose()
        End Try

    End Function
 
    Public Function GetNovoAluno() As DataSet

        'retorna um dataset representando um novo aluno
        Dim conn As OleDb.OleDbConnection = GetConnection()

        Try
            'cria a instrução sql para selecionar alunos da tabela alunos (não vai retornar nada)
            Dim sql As String = "Select * from alunos where id = -1"
            'cria um dataadapter para ser usado com o dataset
            'um dataadapter representa um conjunto de comandos e uma conexão usada para preencher 
            'um dataset e atualizar a fonte de dados
            Dim sa As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(sql, conn)
            'cria o objeto dataset
            Dim ds As New DataSet

            Try
                sa.Fill(ds, "alunos")                                   'retorna um dataset vazio mas com a estrutura correta
                Dim dr As DataRow = ds.Tables(0).NewRow   'cria uma nova linha em branco na tabela
                ds.Tables(0).Rows.Add(dr)                         'inclui a linha em branco no dataset
            Finally
                'estes comandos SEMPRE serão executados pois estao no bloco finally
                'libera o recursos
                sa.Dispose()
            End Try

            'retorna o datasete contendo uma nova linha em branco para um novo aluno
            Return ds
        Finally
            'fecha a conexão e libera o recursos
            'estes comandos SEMPRE serão executados pois estao no bloco finally
            conn.Close()
            conn.Dispose()
        End Try

    End Function
 
    Public Sub SalvaAlunos(ByVal ds As DataSet)

        'pega um conexão com o banco de dados
        Dim conn As OleDb.OleDbConnection = GetConnection()

        Try
            'define a string sql para selecionar alunos da tabela alunos
            Dim sql As String = "select Nome,Sobrenome,id from alunos"
            'cria um dataadapter para ser usado com o dataset
            'um dataadapter representa um conjunto de comandos e uma conexão usada para preencher um 
            'dataset e atualizar a fonte de dados
            Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(sql, conn)

            Try
                'cria um objeto OledbCommandBuilder
                'este objeto fornece um meio de gerar automaticamente 
                'uma tabela unica de comandos usadas para reconciliar 
                'as mudanças feitas no dastaset com o banco de dados associado
                ' pois o OleDbDataAdapter não gera os comandos para efetuar esta conciliação
                Dim cb As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(da)

                'se houve alterações no dataset então atualiza o dataset e aceita as alterações
                'O método acceptChanges faz o commit de todas as alterações feitas para a tabela
                'desde a última vez que acceptChanges foi chamado.
                If ds.HasChanges Then
                    da.Update(ds, "alunos")
                    ds.AcceptChanges()
                End If
            Finally
                'libera o recursos
                da.Dispose()
            End Try

        Finally
            'estes comandos SEMPRE serão executados pois estao no bloco finally
            'fecha a conexão e libera o recursos
            conn.Close()
            conn.Dispose()
        End Try

   End Sub
 
    Public Sub SalvaAluno(ByVal ds As DataSet)
        'Atualiza o dataset representando os alunos
        'obtem uma conexão com o banco de dados
        Dim conn As OleDb.OleDbConnection = GetConnection()

        Try
            'cria a string sql selecionando todos os alunos da tabela alunos
            Dim sql As String = "Select * from alunos"
            'cria um dataadapter para ser usado com o dataset
            'um dataadapter representa um conjunto de comandos e uma conexão usada para preencher um 
            'dataset e atualizar a fonte de dados
            Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(sql, conn)
            Try

                'cria um objeto OledbCommandBuilder
                'este objeto fornece um meio de gerar automaticamente 
                'uma tabela unica de comandos usadas para reconciliar 
                'as mudanças feitas no dastaset com o banco de dados associado
                ' pois o OleDbDataAdapter não gera os comandos para efetuar esta conciliação
                Dim cb As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(da)

                'se houve alterações no dataset então atualiza o dataset e aceita as alterações
                'O método acceptChanges faz o commit de todas as alterações feitas para a tabela
                'desde a última vez que acceptChanges foi chamado.
                If ds.HasChanges Then
                    da.Update(ds, "alunos")
                    ds.AcceptChanges()
                End If
            Finally
                'libera o recursos
                da.Dispose()
            End Try
        Finally
            'estes comandos SEMPRE serão executados pois estao no bloco finally
            'fecha a conexão e libera o recursos
            conn.Close()
            conn.Dispose()
        End Try

    End Sub
 
    Public Sub New(ByVal sDatapath As String)
        'chama o construtor da classe 
        MyBase.new()
        'passa o caminho do banco de dados
        Me.mCaminhoDados = sDatapath
        EscolaDados.DataModule = Me
    End Sub
 
End Class

Neste código cabe comentar que temos duas funções chamadas getAlunos() que possuem assinaturas de métodos diferentes :

1-     Public Overloads Function GetAlunos() As DataSet
 
2-     Public Overloads Function GetAlunos(ByVal campoOrdem As String) As DataSet

O modificador Overloads indica que o método esta sobrecarregado, ou seja, existe mais de uma declaração , cada uma com argumentos diferentes , o que permite ao compilador identificar qual versão pode usar.

 

O restante do código esta comentado e não há o que acrescentar.

 

Se você executar o projeto obterá uma das seguintes visões:

 

O formulário principal com os dados ja carregados A exibição dos detalhes de um aluno.

Os métodos usados para atualizar o dataset e o banco de dados são :

          If ds.HasChanges Then
                    da.Update(ds, "alunos")
                    ds.AcceptChanges()
         End If

Para rejeitar as alterações usamos :

dsAlunos.RejectChanges()

Bem , só resta a você pegar o código completo da aplicação aqui e estudar fazendo melhorias e adaptações a sua realidade:  ApEscola.zip

Eu sei é apenas VB.NET , mas eu gosto...


Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#
 

   Gostou ?   Compartilhe no Facebook    Compartilhe no Twitter

Referências:


José Carlos Macoratti