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 :
Microsoft Access
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:
2 Label
2 TextBox - txtCodigo e txtNome
1 DataGridView - dgvDados
2 Button - btnAdicionar e btnLimpar
1 PictureBox - picImagem
1 LinkLabel - llbLocalizar
1 OpenFileDialog - ofd
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: