VB .NET - Salvando e Recuperando imagens do Microsoft Access


Este é mais um artigo sobre como salvar e recuperar imagens em um banco de dados. Dessa vez vamos salvar e recuperar imagens em um banco de dados Microsoft Access.

Vou criar um projeto bem simples apenas mostrando como alcançar este objetivo.

Fica a seu cargo aplicar as boas práticas ao projeto criando uma camada de acesso a dados e remover o código da camada de apresentação.

Vou usar o Visual Basic 2010 Express Edition para criar o projeto usando a linguagem VB .NET.

Para armazenar as imagens vamos criar um banco de dados chamado Imagens.mdb e um tabela Images com dois campos: ImageID e Image

A estrutura da tabela pode ser vista a seguir:

Criando o projeto

No menu File clique em New Project e informe o nome SalvarImagensAccess:

No formulário form1.vb inclua os controles :

Conforme o leiaute da figura abaixo:

Vamos agora ao código do projeto:

Defina os seguintes namespaces:

Imports System.Data.OleDb
Imports System.IO

Em seguida no início do formulário vamos definir a string de conexão e as variáveis objetos para acessar e tratar os dados:

Dim cnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=c:\dados\Imagens.mdb"

Dim imgNome As String
Dim daImagem As OleDbDataAdapter
Dim dsImagem As DataSet

No evento Load do formulário vamos chamar a rotina para preencher a combobox com as informações das imagens já salvas no banco de dados exibindo o seu código:

 Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        preencheCombo()
    End Sub

A rotina preencheCombo() é mostrada a seguir:

Private Sub preencheCombo()
        Try
            Dim CN As New OleDbConnection(cnString)

            CN.Open()
            daImagem = New OleDbDataAdapter()
            daImagem.SelectCommand = New OleDbCommand("SELECT * FROM images", CN)
            dsImagem = New DataSet("dsImagem")

            daImagem.Fill(dsImagem)
            Dim dtable As DataTable
            dtable = dsImagem.Tables(0)
            cboImagemID.Items.Clear()

            For Each drow As DataRow In dtable.Rows
                cboImagemID.Items.Add(drow(0).ToString())
                cboImagemID.SelectedIndex = 0
            Next
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

No evento Click do botão - Carregar Imagem de um Arquivo - temos o código a seguir que abre uma caixa de diálogo para que seja selecionado um arquivo de imagem:

 Private Sub btnCarregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCarregar.Click
        Try
            Dim dlgImage As FileDialog = New OpenFileDialog()

            dlgImage.Filter = "Image File (*.jpg;*.bmp;*.gif)|*.jpg;*.bmp;*.gif"

            If dlgImage.ShowDialog() = DialogResult.OK Then
                imgNome = dlgImage.FileName
                Dim newimg As New Bitmap(imgNome)
                imgSalvar.SizeMode = PictureBoxSizeMode.StretchImage
                imgSalvar.Image = DirectCast(newimg, Image)
            End If

            dlgImage = Nothing
        Catch ae As System.ArgumentException
            imgNome = " "

            MessageBox.Show(ae.Message.ToString())
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())
        End Try
    End Sub

No evento Click do botão - Salvar imagem no banco de dados - salva a imagem no banco de dados:

 Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click
        Try
            If imgNome <> "" Then
                Dim fs As FileStream

                fs = New FileStream(imgNome, FileMode.Open, FileAccess.Read)
                Dim picByte As Byte() = New Byte(fs.Length - 1) {}
                fs.Read(picByte, 0, System.Convert.ToInt32(fs.Length))
                fs.Close()

                Dim CN As New OleDbConnection(cnString)
                CN.Open()
                Dim strSQL As String
                strSQL = "INSERT INTO Images([Image]) values (" & " @Img)"

                Dim imgParam As New OleDbParameter()

                imgParam.OleDbType = OleDbType.Binary
                imgParam.ParameterName = "Img"
                imgParam.Value = picByte

                Dim cmd As New OleDbCommand(strSQL, CN)
                cmd.Parameters.Add(imgParam)
                cmd.ExecuteNonQuery()

                MessageBox.Show("Imagem salva com sucesso.")
                cmd.Dispose()
                CN.Close()
                CN.Dispose()
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

        preencheCombo()
    End Sub

Abaixo temos o código do evento Click do botão - Carregar imagem do banco de dados - que recupera uma imagem salva no banco de dados a partir do seu Id;

Private Sub btnRecuperarImgBD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRecuperarImgBD.Click
        Dim dataTable As DataTable = dsImagem.Tables(0)

        If imgRecuperar.Image IsNot Nothing Then
            imgRecuperar.Image.Dispose()
        End If

        Dim fsImage As New FileStream("image.jpg", FileMode.Create)

        For Each dataRow As DataRow In dataTable.Rows
            If dataRow(0).ToString() = cboImagemID.SelectedItem.ToString() Then
                Dim blob As Byte() = DirectCast(dataRow(1), Byte())
                fsImage.Write(blob, 0, blob.Length)
                fsImage.Close()
                fsImage = Nothing
                imgRecuperar.Image = Image.FromFile("image.jpg")
                imgRecuperar.SizeMode = PictureBoxSizeMode.StretchImage
                imgRecuperar.Refresh()
            End If
        Next
    End Sub

Executando o projeto podemos escolher uma imagem e salvá-la ou recuperar uma imagem já salva conforme mostra a figura a seguir:

Pegue o projeto completo para estudo aqui: SalvarImagensAccess.zip

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

"E Jesus lhes disse: Eu sou o pão da vida: aquele que vem a mim não terá fome; e quem crê em mim nunca terá sede." (João 6:35)

Referências:

José Carlos Macoratti