VB .NET - Salvando imagens em um banco de dados Microsoft Access (Para novatos)


 Neste artigo eu vou apresentar uma pequena aplicação feita na linguagem VB .NET que permite salvar, consultar e exibir imagens em um banco de dados Microsoft Access. Este artigo é destino a quem esta iniciando na linguagem VB .NET e quer aprender como acessar e salvar imagens em um banco de dados Microsoft Access.

Em meu artigo - ADO.NET - Criando um cadastro de clientes -  criei uma pequena aplicação para gerenciar os dados dos clientes em uma base de dados Access. Que tal armazenar  no banco de dados a foto do cliente de forma que a poder exibi-la no formulário em um controle PictureBox ?  É isto que vamos fazer neste artigo.

Podemos armazenar imagens diretamente no banco de dados ou podemos optar por guardar somente a referência à imagem. Você deve considerar com cuidado qual solução vai adotar pois cada uma tem suas vantagens e desvantagens.

Guardar a referência da imagem no banco de dados é mais simples em termos de código e tem a vantagem de ocupar muito menos espaço do seu banco de dados. Você cria um campo no banco de dados onde guarda o caminho e o nome da imagem. Para exibir a imagem basta recuperar o caminho e nome da imagem exibindo-a em um controle PictureBox. A desvantagem é que você terá que gerenciar a localização das imagens externamente a sua aplicação.

Nota: No VB.NET não existe mais o controle Image . Temos somente o controle PictureBox que agora suporta também arquivos GIF animados. Muitas de suas propriedades mudaram e outras não existem mais. Se você quiser consumir menos recursos pode sobrepor o evento OnPaint do formulário e usar o método DrawImage para exibir uma imagem.

Armazenando as imagens no seu banco de dados você não precisa se preocupar com sua localização, mas o código para salvar e recuperar uma imagem é mais complexo e você terá que considerar que o tamanho do seu banco de dados será bem maior. No caso de um banco de dados Access isto pode ser um fator limitante que você deverá considerar pois o tamanho máximo que um banco de dados Access pode chegar é algo em torno de 2 GB.

No artigo - Salvando imagens em um banco de dados - eu mostro uma outra forma de gravar imagens em um banco de dados

Vou adotar a segunda solução e armazenar e recuperar as imagens diretamente no banco de dados Microsoft Access.

Para isto vou criar um projeto no Visual Studio 2013 Express for windows dekstop e criar um banco de dados Dados.mdb e a tabela tblAlunos....

 A primeira coisa a faze é criar a estrutura do banco de dados e incluir um campo para armazenar as fotos dos alunos.

Vou incluir os campos Codigo, Nome e o campo Foto como do tipo Objeto OLE pois iremos armazenar dados no formato binário.(Você pode armazenar imagens , arquivos de áudio , etc.)

Veja ao lado como deve ficar a estrutura da tabela tblAlunos do banco de dados Dados.mdb que criamos para este exemplo:

Nosso banco de dados Dados.mdb esta na pasta bin\Debug do projeto.

Recursos Usados :

Criando o projeto no Visual Studio 2013 Express for Windows Desktop

Abra o VS Express 2013 for Windows Desktop e clique em New Project;

A seguir selecione a linguagem Visual Basic e o template Windows Forms Application;

Informe o nome SalvarImagem_Access e clique no botão OK;

A seguir selecione o  formulário padrão form1.vb e altere o seu nome para frmAlunos e a seguir inclua, a partir da ToolBox, os seguintes controles:

Disponha os controles no formulário conforme a figura abaixo:

Agora vamos definir o código no formulário em cada evento Click dos botões de comando e do controle LinkLabel.

No evento Load do formulário frmAlunos vamos incluir o código abaixo:

Private Sub frmAlunos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim cn As New OleDb.OleDbConnection
        cn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=" & _
                                        Application.StartupPath & "\Dados.mdb"
        Try
            Dim cmd As New OleDb.OleDbCommand
            cmd.Connection = cn
            cmd.CommandText = "SELECT * FROM tblAlunos"
            cn.Open()
            '
            Dim reader As OleDb.OleDbDataReader = cmd.ExecuteReader()
            If reader.HasRows Then
                Dim dt As New DataTable()
                dt.Load(reader)
                dgvDados.DataSource = dt
            End If
        Finally
            cn.Close()
        End Try
    End Sub

Este código cria uma conexão com o banco de dados Dados.mdb e a seguir cria um DataTable que é exibido no controle DataGridView.

Para localizar uma foto usamos o evento LinkClicked do controle LinkLabel e incluímos nele o seguinte código:

 Private Sub llbLocalizar_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles llbLocalizar.LinkClicked
        If Me.ofd.ShowDialog = 1 Then
            Me.picFoto.Image = System.Drawing.Image.FromFile(Me.ofd.FileName)
        End If
    End Sub

Este código abre a caixa de diálogo OpenFileDialog que permite ao usuário selecionar uma foto e a seguir atribui o nome do arquivo ao controle PictureBox.

Agora no evento Click do botão Adicionar vamos digitar o código abaixo:

  Private Sub btnAdicionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdicionar.Click
        Dim cn As New OleDb.OleDbConnection
        cn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=" & _
                                       Application.StartupPath & "\Dados.mdb"
        Try
            cn.Open()
            Dim arrImage() As Byte
            Dim strImage As String
            Dim myMs As New IO.MemoryStream
            '
            If Not IsNothing(Me.picFoto.Image) Then
                Me.picFoto.Image.Save(myMs, Me.picFoto.Image.RawFormat)
                arrImage = myMs.GetBuffer
                strImage = "?"
            Else
                arrImage = Nothing
                strImage = "NULL"
            End If
            Dim cmd As New OleDb.OleDbCommand
            cmd.Connection = cn
            cmd.CommandText = "INSERT INTO tblAlunos(Codigo, [Nome], Foto) VALUES(" & Me.txtCodigo.Text & ",'" & _
                                          Me.txtNome.Text & "'," & strImage & ")"
            If strImage = "?" Then
                cmd.Parameters.Add(strImage, OleDb.OleDbType.Binary).Value = arrImage
            End If
            '
            cmd.ExecuteNonQuery()
            MsgBox("Dados salvos com sucesso.")
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            cn.Close()
        End Try
    End Sub

 

Este código inclui os dados do formulário na tabela tblAlunos usando uma instrução INSERT INTO usando o método ExecuteNonQuery do objeto Command. Observe o tratamento que é dado à imagem selecionada no controle PictureBox. Estamos armazenando a imagem em um array de bytes.

Agora no evento Click do botão Localizar inclua o código abaixo:

 Private Sub btnLocalizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLocalizar.Click
        Dim cn As New OleDb.OleDbConnection
        cn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0; " & _
                                       " Data Source=" & Application.StartupPath & "\Dados.mdb"
        Try
            cn.Open()
            Dim arrImage() As Byte
            Dim myMS As New IO.MemoryStream
            Dim da As New OleDb.OleDbDataAdapter("SELECT * FROM tblAlunos " & _
                                                                    " WHERE Codigo=" & Me.txtCodigo.Text, cn)
            Dim dt As New DataTable
            da.Fill(dt)
            If dt.Rows.Count > 0 Then
                Me.txtNome.Text = dt.Rows(0).Item("Nome") & ""
                If Not IsDBNull(dt.Rows(0).Item("Foto")) Then
                    arrImage = dt.Rows(0).Item("Foto")
                    For Each ar As Byte In arrImage
                        myMS.WriteByte(ar)
                    Next
                    Me.picFoto.Image = System.Drawing.Image.FromStream(myMS)
                End If
                Me.btnAdicionar.Enabled = False
            Else
                MsgBox("Registro não encontrado!")
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            cn.Close()
        End Try
    End Sub

Este código usa uma instrução SQL SELECT coma cláusula WHERE usando o código do aluno como critério para localizar os dados na tabela tblAlunos. Observe que para exibir a imagem no controle PictureBox extraímos a informação do array de bytes.

Podemos exibir as informações do DataGridView no formulário clicando em uma célula e assim visualizarmos os detalhes dos registros:

Private Sub dgvDados_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvDados.CellClick
        Try
            'obtem o valor das células do grid
            txtCodigo.Text = dgvDados.CurrentRow.Cells(0).Value.ToString()
            txtNome.Text = dgvDados.CurrentRow.Cells(1).Value.ToString()
            Dim ms As New MemoryStream(CType(dgvDados.CurrentRow.Cells(2).Value, Byte()))
            picFoto.Image = Image.FromStream(ms)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

O código obtém o valor de cada célula da linha selecionada e exibe no formulário os valores.

Executando o projeto temos o seguinte resultado :

É um projeto bem simples e de fácil entendimento para quem esta iniciando com a linguagem VB .NET.

Pegue o projeto completo aqui:  SalvarImagem_Access.zip

Lucas 8:20 E foi-lhe dito: Estão lá fora tua mãe e teus irmãos, que querem ver-te,
Lucas 8:21
Mas, respondendo ele (Jesus), disse-lhes: Minha mãe e meus irmãos são aqueles que ouvem a palavra de Deus e a executam.

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti