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:
|
A estrutura da nossa solução será a seguinte :
Temos
uma solução chamada - Escola e dois projetos:
|
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:
Visão geral do modelo de objeto Excel: http://msdn.microsoft.com/pt-br/library/wss56bz7.aspx