VB .NET - Inserindo imagem em um banco de dados (dica rápida)


Esta é uma pergunta recorrente em muitos fóruns : Como inserir uma imagem em um banco de dados ?

Do que você vai precisar ?

  1. Visual Studio 2012 Express for desktop
  2. SQL Server 2008

Crie um banco de dados ou utilize um banco de dados já existente para o qual deseja incluir a imagem.

Você pode usar o script SQL abaixo com exemplo para criar a tabela onde vai incluir a imagem:

CREATE TABLE [dbo].[Impressoes] (
    [Id]     INT   IDENTITY (1, 1) NOT NULL,
    [Imagem] IMAGE NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

Abra o Visual Studio 2012 Express for desktop e crie um novo projeto do tipo Windows Forms Application com o nome ImagemDB;

No formulário form1.vb inclua os seguintes controles a partir da ToolBox:

  1. PictureBox - picImagem - ModeSize = Zoom
  2. Button - btnSalvarImagem - Salvar Imagem
  3. Button - btnObterImagem - Escolher Imagem
  4. Button - btnRecuperarImagem - Recuperar Imagem

O leiaute do formulário é mostrado a seguir:

O projeto irá usar dois namespaces:

Imports System.Data.SqlClient
Imports System.IO

Vamos definir uma variável privada referente a imagem a ser armazenada no banco de dados:

Private ImageAUsar As Image

Vamos ao código:

1- Para escolher uma imagem a ser salva

 Private Sub btnObterImagem_Click(sender As Object, e As EventArgs) Handles btnObterImagem.Click
        Using OFD As New OpenFileDialog With {.Filter = "Jpg (*.jpg)|*.jpg"}
            If OFD.ShowDialog = DialogResult.OK Then
                ImageAUsar = Image.FromFile(OFD.FileName)
                picImagem.Image = ImageAUsar
            End If
        End Using
 End Sub

Usamos um OpenFileDialog para permitir que o usuário escolha uma imagem no sistema de arquivos.

2- Para salvar a imagem escolhida

Private Sub btnSalvarImagem_Click(sender As Object, e As EventArgs) Handles btnSalvarImagem.Click
        Try
            Using con As New SqlConnection("Data Source=(LocalDB)\v11.0;Initial Catalog=Cadastro;Integrated Security=True")
                Using com As New SqlCommand("Insert into Impressoes(Imagem) values (@Imagem)", con)
                    Using ms As New IO.MemoryStream
                        ImageAUsar.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
                        Dim byteArray = ms.ToArray
                        com.Parameters.AddWithValue("@Imagem", byteArray)
                        con.Open()
                        com.ExecuteNonQuery()
                    End Using
                End Using
            End Using
        Catch ex As Exception
            MessageBox.Show(" Erro " & ex.Message)
        End Try
End Sub

A tabela Impressoes do SQL Server LocalDB possui um campo chamado Imagem onde iremos salvar a imagem selecionada usando o comando ExecuteNonQuery().

Nota: SQL Server Express LocalDB é uma versão leve do SQL Server que tem muitas características de programação de um banco de dados SQL Server. O SQL Server Express LocalDB é executado no modo de usuário e tem uma instalação rápida sem a necessidade de configuração.

3- Para recuperar uma imagem do banco de dados pelo seu Id

 Private Sub btnRecuperarImagem_Click(sender As Object, e As EventArgs) Handles btnRecuperarImagem.Click
        Try
            Dim oValor As String = InputBox("Informe o código da Imagem", "Recupera Imagens", "1", 400, 400)
            If String.IsNullOrWhiteSpace(oValor) Then
                Exit Sub
            End If
            Using con As New SqlConnection("Data Source=(LocalDB)\v11.0;Initial Catalog=Cadastro;Integrated Security=True")
                Using com As New SqlCommand("Select Imagem from Impressoes where ID=@ID", con)
                    com.Parameters.AddWithValue("@ID", Convert.ToInt32(oValor))
                    con.Open()
                    Dim tempImagem As Byte() = DirectCast(com.ExecuteScalar(), Byte())
                    If tempImagem Is Nothing Then
                        MessageBox.Show("Imagem não localizada", "Erro")
                        Exit Sub
                    Else
                        Dim strArquivo As String = Convert.ToString(DateTime.Now.ToFileTime())
                        Dim fs As New FileStream(strArquivo, FileMode.CreateNew, FileAccess.Write)
                        fs.Write(tempImagem, 0, tempImagem.Length)
                        fs.Flush()
                        fs.Close()
                        picImagem.Image = Image.FromFile(strArquivo)
                    End If
                End Using
            End Using
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

Utilizamos o controle InputBox para que o usuário informe o número do Id da imagem a ser recuperada através do comando SQL : "Select Imagem from Impressoes where ID=@ID" executando pela instrução ExecuteScalar.

Executando a aplicação, escolhendo , salvando e recuperando uma imagem teremos o resultado abaixo:

1- Escolhendo e salvando uma imagem

2- recuperando uma imagem pelo seu Código

Pegue o projeto completo aqui: ImagemBD.zip

Mat 7:19 Toda árvore que não produz bom fruto é cortada e lançada no fogo.

Mat 7:20 Portanto, pelos seus frutos os conhecereis.

Mat 7:21 Nem todo o que me diz: Senhor, Senhor! entrará no reino dos céus, mas aquele que faz a vontade de meu Pai, que está nos céus.

        Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti