VB .NET - Acessando um banco de dados Access (CRUD) - I


Este é mais um exemplo onde temos o acesso a um banco de dados Microsoft Access e realizamos as operações de manutenção de dados (CRUD) usando a linguagem VB .NET.

É um exemplo básico para iniciantes e foi criado para ser simples e fácil de entender.

Vou mostrar cada etapa básica necessária para construir essa aplicação na esperança de que tudo fique bem claro ao iniciante.

Portanto se você é iniciante na linguagem VB .NET ou esta migrando de outra linguagem e quer aprender como acessar um banco de dados acompanhe cada etapa.

Na segunda parte irei  mostrar como podemos separar as responsabilidades criando uma camada de acesso aos dados e removendo o código que realiza esta tarefa da camada de apresentação.

Objetivos

Nosso objetivo será acessar a tabela Alunos do banco de dados Escola.mdb e realizar as operações de seleção, inclusão, alteração e exclusão de dados.(CRUD)

1- Do que eu vou precisar ?

Você vai precisar de um ambiente onde a linguagem Visual Basic .NET possa ser desenvolvida e de um banco de dados.

Para começar uma boa notícia : as ferramentas que você vai precisar são todas grátis e você não vai gastar um centavo para aprender.

No link abaixo você poderá baixar o Visual Basic 2010 Express Edition. Ele é grátis, totalmente funcional e não tem restrições. Após algum tempo de uso você será solicitado a efetuar um registro mas fique tranquilo é apenas para controle da Microsoft a ferramenta é realmente grátis.

  1. Visual Basic 2010 Express Edition

Neste momento você também já pode usar as novas versões do Visual Studio 2012. Veja neste link:

Como você vai criar o banco de dados ?

Para criar o banco de dados nós vamos usar o próprio Visual Basic 2010 Express mas antes de fazer isso, você deve ter conceitos básicos sobre o que é um banco de dados, o que é são tabelas e o que é a linguagem SQL. Siga os links destes artigos do site:

Se você desejar pode criar o banco de dados no Microsoft Access. Veja este link: Criando banco de dados e tabelas com o Access

Obs: O banco de dados do Microsoft Access 2007 sofreu algumas alterações em relação as versões anteriores. Veja este artigo: VB .NET - Acesso ao Microsoft Access 2007 .accdb - Macoratti.net

Criando o banco de dados no Visual Basic 2010 Express Edition

Abra o Visual Basic 2010 Express Edition e no menu View selecione Other Windows e clique em DataBase Explorer;

Você verá a janela DataBase Explorer exibindo as conexões existentes com banco de dados:

Vamos criar um novo Banco de dados e para o exemplo eu vou chamá-lo de Escola.mdb .

Clique com o botão direito sobre Data Connections e a seguir em Add Connection...

Na janela Add Connection clique no botão Change para abrir a janela que irá exibir as fontes de dados disponíveis no seu sistema;

Selecione o item Microsoft Access DataBase File e clique em OK;

Vamos criar a tabela Alunos que vai conter três campos :

Criando o projeto no Visual Basic 2010 Express

Abra o Visual Basic 2010 Express Edition e no menu File clique em New Project e selecione o template Windows Forms Application com o nome CadastroAlunosAccess;

Agora vamos definir no formulário form1.vb a interface para interação com o usuário. Vamos exibir as informações nos controles TextBox, Image e DataGridView no formulário form1.vb.

Para isso abra a janela ToolBox e arraste e inclua os controles abaixo no formulário:

Disponha os controles conforme o leiaute abaixo:

Definindo o código do projeto

Para realizar a conexão com um banco de dados podemos usar a tecnologia ADO .NET da plataforma .NET.

Para uma introdução básica sobre ADO .NET veja estes artigos:

Criar uma conexão com uma fonte de dados significa usar o componente apropriado e fornecer informações ao componente para que ele possa encontrar a base de dados e poder acessar informações a partir dela.

Como vamos acessar um banco de dados Microsoft Access vamos usar o provedor de dados OleDb(OLE DB .NET Data Provider):

Este provedor de dados está localizado no namespace System.Data.OleDb, logo, temos que declarar este namespace e o namespace System.Data que vai dar acesso aos objetos ADO .NET no início do nosso formulário:

Imports System.Data
Imports System.Data.OleDb

A definição da string de conexão com o banco de dados é fundamental. Nosso banco de dados Escola.mdb está localizado na pasta c:\dados e portanto nossa string de conexão será:

"Provider=Microsoft.Jet.OleDb.4.0; Data Source=c:\dados\Escola.mdb"

No evento Load do formulário que ocorre quando a aplicação for aberta vamos definir o código que chama a rotina CarregaDados();

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        CarregaDados()
    End Sub

A rotina CarregaDados() vai acessar o banco de dados e selecionar todas as informações existentes e exibi-las no controle DataGridView no formulário form1;

 Private Sub CarregaDados()

        Dim cn As New OleDb.OleDbConnection
        cn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=c:\dados\Escola.mdb"
        cn.Open()

        Try
            With Cmd
                .CommandType = CommandType.Text
                .CommandText = "SELECT * from Alunos"
                .Connection = cn
            End With

            With Da
                .SelectCommand = Cmd
                Dt = New DataTable
                .Fill(Dt)
                dgvAlunos.DataSource = Dt
            End With

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

A seguir temos o código do evento Click do botão Incluir que acessa o banco de dados, abre uma conexão e inclui um novo registro na tabela Alunos usando uma instrução SQL INSERT INTO;

Private Sub btnIncluir_Click(sender As System.Object, e As System.EventArgs) Handles btnIncluir.Click
        Dim cn As New OleDb.OleDbConnection
        cn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=c:\dados\Escola.mdb"
        cn.Open()

        Dim arrImagem() As Byte
        Dim strImagem As String
        Dim ms As New IO.MemoryStream

        If txtNome.Text = String.Empty Then
            MsgBox("Informe o nome do aluno")
            txtNome.Focus()
            Return
        End If
        '
        If Not IsNothing(Me.picFoto.Image) Then
            Me.picFoto.Image.Save(ms, Me.picFoto.Image.RawFormat)
            arrImagem = ms.GetBuffer
            strImagem = "?"
        Else
            arrImagem = Nothing
            strImagem = "NULL"
        End If

        Dim myCmd As New OleDb.OleDbCommand
        myCmd.Connection = cn
        myCmd.CommandText = "INSERT INTO Alunos(nome, imagem) " & _
                                               " VALUES( '" & Me.txtNome.Text & "'," & strImagem & ")"

        If strImagem = "?" Then
            myCmd.Parameters.Add(strImagem, OleDb.OleDbType.Binary).Value = arrImagem
        End If

        myCmd.ExecuteNonQuery()
        MsgBox("Dados Salvos com sucesso!")

        cn.Close()
        CarregaDados()
    End Sub

No evento Click do botão de comando Procurar o código abaixo chama a rotina Procurar();

 Private Sub btnProcurar_Click(sender As System.Object, e As System.EventArgs) Handles btnProcurar.Click
        If txtCodigo.Text = String.Empty Then
            MsgBox("Informe o codigo do aluno")
        Else
            Procurar(Me.txtCodigo.Text)
        End If
    End Sub

A rotina Procurar() recebe o código do aluno, abre a conexão com o banco de dados e seleciona o aluno pelo seu código preenchendo um DataTable e populando os controles do formulário com os dados obtidos;

 Private Sub Procurar(ByVal codigo As Integer)
        Dim cn As New OleDb.OleDbConnection
        cn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=c:\dados\Escola.mdb"
        cn.Open()

        Dim arrImagem() As Byte
        Dim ms As New IO.MemoryStream
        Dim da As New OleDb.OleDbDataAdapter("SELECT * FROM Alunos " & _
                                                                        " WHERE codigo=" & codigo, cn)
        Dim dt As New DataTable
        da.Fill(dt)

        If dt.Rows.Count > 0 Then
            Me.txtCodigo.Text = dt.Rows(0).Item("codigo")
            Me.txtNome.Text = dt.Rows(0).Item("nome") & ""
            If Not IsDBNull(dt.Rows(0).Item("imagem")) Then
                arrImagem = dt.Rows(0).Item("imagem")
                For Each ar As Byte In arrImagem
                    ms.WriteByte(ar)
                Next
                Me.picFoto.Image = System.Drawing.Image.FromStream(ms)
            Else
                Me.picFoto.Image = System.Drawing.Image.FromFile(Application.StartupPath & "/semfoto.jpg")
            End If
            Me.btnIncluir.Enabled = False
        Else
            MsgBox("Registro não localizado")
        End If

        cn.Close()

    End Sub

No evento Click do controle LinkLabel o código abre uma caixa de diálogo para que uma imagem seja selecionada e exibida no controle Image;

 Private Sub lnkProcurar_LinkClicked(sender As System.Object, e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles lnkProcurar.LinkClicked
        If Me.ofdImagem.ShowDialog = 1 Then
            Me.picFoto.Image = System.Drawing.Image.FromFile(Me.ofdImagem.FileName)
        Else
            Me.picFoto.Image = System.Drawing.Image.FromFile(Application.StartupPath & "/semfoto.jpg")
        End If
    End Sub

No evento CellClick do controle DataGridView quando o usuário clicar em um célula do controle iremos selecionar o código da célula clicada e chamar a rotina Procurar passando este código;

Private Sub dgvAlunos_CellClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvAlunos.CellClick
        Try
            'Dim codigo As Integer = dgvAlunos.Rows(e.RowIndex).Cells(e.ColumnIndex).Value()
            Dim codigo As Integer = dgvAlunos.Rows(e.RowIndex).Cells(0).Value()
            Procurar(codigo)
        Catch ex As Exception
            MsgBox("Seleção Inválida. Clique em uma célula com dados.")
        End Try
    End Sub

Para saber mais sobre como trabalhar como controle DataGridView veja os meus artigos:

No evento Click do botão Limpar limpamos os controles do formulário;

 Private Sub btnLimpar_Click(sender As System.Object, e As System.EventArgs) Handles btnLimpar.Click
        Me.txtCodigo.Text = ""
        Me.txtNome.Text = ""
        Me.picFoto.Image = Nothing
        Me.txtCodigo.Focus()
        Me.btnIncluir.Enabled = True
    End Sub

O evento Click do botão Deletar será solicitada uma confirmação para excluir o registro selecionado; a seguir será aberta uma conexão com o banco de dados e o registro selecionado será deletado usando a instrução SQL DELETE FROM;

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

        Dim resultado As DialogResult = MessageBox.Show("Confirma a exclusão deste registro ?", _
            "Excluir", MessageBoxButtons.YesNo, MessageBoxIcon.Question)

        If resultado = vbYes Then
            Dim cn As New OleDb.OleDbConnection
            cn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=c:\dados\Escola.mdb"
            cn.Open()

            If txtCodigo.Text = String.Empty Then
                MsgBox("Informe o codigo do aluno")
                txtNome.Focus()
                Return
            End If

            Dim myCmd As New OleDb.OleDbCommand
            myCmd.Connection = cn
            myCmd.CommandText = "DELETE FROM Alunos WHERE codigo = " & txtCodigo.Text

            myCmd.ExecuteNonQuery()
            MsgBox("Dados excluídos com sucesso!")

            cn.Close()
            CarregaDados()
        End If
    End Sub

No evento Click do botão Alterar abrimos uma conexão com o banco de dados e alteramos as informações do registro selecionado usando a instrução SQL UPDATE/SET;

Private Sub btnAlterar_Click(sender As System.Object, e As System.EventArgs) Handles btnAlterar.Click
        Dim cn As New OleDb.OleDbConnection
        cn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=c:\dados\Escola.mdb"
        cn.Open()

        Dim arrImagem() As Byte
        Dim strImagem As String
        Dim ms As New IO.MemoryStream

        If txtNome.Text = String.Empty Then
            MsgBox("Informe o nome do aluno")
            txtNome.Focus()
            Return
        End If
        '
        If Not IsNothing(Me.picFoto.Image) Then
            Me.picFoto.Image.Save(ms, Me.picFoto.Image.RawFormat)
            arrImagem = ms.GetBuffer
            strImagem = "?"
        Else
            arrImagem = Nothing
            strImagem = "NULL"
        End If

        Dim myCmd As New OleDb.OleDbCommand
        myCmd.Connection = cn
        myCmd.CommandText = "Update Alunos SET nome = '" & txtNome.Text & "'," & "imagem = " & strImagem & " WHERE codigo =" & txtCodigo.Text

        If strImagem = "?" Then
            myCmd.Parameters.Add(strImagem, OleDb.OleDbType.Binary).Value = arrImagem
        End If

        myCmd.ExecuteNonQuery()
        MsgBox("Dados Alterados com sucesso!")

        cn.Close()
        CarregaDados()
    End Sub

No evento Validating da caixa de texto txtNome usamos o controle ErrorProvider para validar o campo txtNome;

 Private Sub txtNome_Validating(sender As System.Object, e As System.ComponentModel.CancelEventArgs) Handles txtNome.Validating
        If (txtNome.Text.Trim().Length = 0) Then
            erro.SetError(txtNome, "Informe o nome do aluno")
        Else
            erro.SetError(txtNome, "")
        End If
    End Sub

Para saber detalhes de como usar o controle ErrorProvider veja o meu artigo: Usando o ErrorProvider - Macoratti.net

Executando a solução teremos a exibição do formulário conforme mostra a figura abaixo:

È um projeto simples que deverá ser melhorado com a remoção de todo o código que faz o acesso aos dados do formulário e separado em uma classe de acesso aos dados.

Veremos isso em outro artigo mostrando como podemos, mesmo no início, começar a adotar boas práticas de desenvolvimento e ter um código mais robusto.

Pegue o projeto completo aqui: CadastroAlunosAccess.zip

Aguarde que em outro artigo eu vou mostrar como criar uma camada de acesso dados separando o código com essa responsabilidade da interface.

VB .NET - Acessando um banco de dados Access (CRUD) - II

Heb 2:13 E outra vez: Porei nele a minha confiança. E ainda: Eis-me aqui, e os filhos que Deus me deu.

Heb 2:14 Portanto, visto como os filhos são participantes comuns de carne e sangue, também ele semelhantemente participou das mesmas coisas, para que pela morte derrotasse aquele que tinha o poder da morte, isto é, o Diabo;

Heb 2:15 e livrasse todos aqueles que, com medo da morte, estavam por toda a vida sujeitos à escravidão.

Heb 2:16 Pois, na verdade, não presta auxílio aos anjos, mas sim à descendência de Abraão.

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti