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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#