VB .NET - Lendo imagens em um banco de dados MySQL - II
Neste artigo eu vou mostrar como podemos acessar e ler imagens em um banco de dados MySQL usando a linguagem VB .NET em um projeto Windows Forms. |
Chegou o Curso ASP .NET MVC 5 Vídeo Aulas (C#)
Nível : Básico
Este artigo complementa o artigo - VB .NET - Inserindo imagens em um banco de dados MySQL, e nele vamos acessar e ler as informações e recuperar as imagens inseridas em uma tabela de um banco de dados MySQL.
Vamos acessar o banco de dados escola e as informações da tabela alunos que possui a seguinte estrutura:
Abaixo vemos a estrutura da tabela no MySQL WorkBench:
Note que o campo Id é do tipo chave primária e do tipo auto incremental.
Vamos acessar as imagens e exibir um show de slides com as imagens da tabela alunos.
Incluindo um novo formulário no projeto
Vamos aproveitar o projeto criado no artigo anterior chamado Imagens_MySQL.
Abra o Visual Studio 2013 Express for Windows dekstop e clique em Open Project;
A seguir selecione o projeto Imagens_MySQL e clique no botão OK;
Agora no menu PROJECT clique em Add Windows Forms e aceite o nome Form2.vb.
A seguir a partir da ToolBox inclua os seguintes controles no formulário form1.vb :
1 PictureBox - name=picImagens
1 Button - name=btnLerImagens
1 BackGroundWorkd - name=bckwrk1
Disponha os controles conforme o leiaute da imagem a seguir:
Agora vamos declarar no formulário form2.vb os namespaces abaixo para acessar as classes dos provedores .NET para o MySQL :
Imports
MySql.Data.MySqlClientAgora no evento Click do botão de comando btnLerImagens vamos incluir o código que irá chamar o método GetImagens():
VB.NET :
Private Sub btnLerImagens_Click(sender As Object, e As EventArgs) Handles btnLerImagens.Click
GetImagens()
End Sub
|
C# |
private void btnLerImagens_Click(object sender, EventArgs e)
{
GetImagens();
}
|
O método GetImagens() é que vai realizar o
acesso a tabela do MySQL e ler as imagens e as salva em um diretório chamado
Imagens que foi criado na pasta bin\Debug do projeto:
VB.NET :
Private Sub GetImagens()
Dim _conexaoMySQL As String = "server=localhost;user id=root;password=gpxpst;database=escola"
Dim con As MySqlConnection = New MySqlConnection(_conexaoMySQL)
Dim cmd As MySqlCommand
Dim reader As MySqlDataReader
Dim AlunoId As Integer
Dim cmdSQL As String = "SELECT id, imagem FROM alunos"
Dim fs As FileStream
Dim bw As BinaryWriter
Dim TamanhoBuffer As Integer = 1024
'Os Arrays em VB.NET contam elementos a partir do 0(lower bound) até um dado tamanho(upper bound).
'Logo para declarar um array de 1024 elements seu tamanho deve ser de 1023
Dim DadosImagem(TamanhoBuffer - 1) As Byte
Dim nBytesRetornados, IndiceInicio As Long
Try
cmd = New MySqlCommand(cmdSQL, con)
con.Open()
reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
If (Directory.Exists("Imagens") = False) Then
Directory.CreateDirectory("Imagens")
End If
While (reader.Read())
AlunoId = reader.GetInt32("id")
fs = New FileStream("Imagens/Imagem_" + AlunoId.ToString() + ".jpg", FileMode.OpenOrCreate, FileAccess.Write)
bw = New BinaryWriter(fs)
IndiceInicio = 0
nBytesRetornados = reader.GetBytes(1, IndiceInicio, DadosImagem, 0, TamanhoBuffer)
While (nBytesRetornados = TamanhoBuffer)
bw.Write(DadosImagem)
bw.Flush()
IndiceInicio += TamanhoBuffer
nBytesRetornados = reader.GetBytes(1, IndiceInicio, DadosImagem, 0, TamanhoBuffer)
End While
bw.Close()
fs.Close()
End While
reader.Close()
con.Close()
bckwrk1.RunWorkerAsync()
Catch ex As Exception
MessageBox.Show("Erro :" & ex.Message)
End Try
End Sub
|
C# |
private void GetImagens()
{
string _conexaoMySQL = "server=localhost;user id=root;password=gpxpst;database=escola";
MySqlConnection con = new MySqlConnection(_conexaoMySQL);
MySqlCommand cmd = default(MySqlCommand);
MySqlDataReader reader = default(MySqlDataReader);
int AlunoId = 0;
string cmdSQL = "SELECT id, imagem FROM alunos";
FileStream fs = default(FileStream);
BinaryWriter bw = default(BinaryWriter);
int TamanhoBuffer = 1024;
//Os Arrays em VB.NET contam elementos a partir do 0(lower bound) até um dado tamanho(upper bound).
//Logo para declarar um array de 1024 elements seu tamanho deve ser de 1023
byte[] DadosImagem = new byte[TamanhoBuffer];
long nBytesRetornados = 0;
long IndiceInicio = 0;
try {
cmd = new MySqlCommand(cmdSQL, con);
con.Open();
reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
if ((Directory.Exists("Imagens") == false)) {
Directory.CreateDirectory("Imagens");
}
while ((reader.Read())) {
AlunoId = reader.GetInt32("id");
fs = new FileStream("Imagens/Imagem_" + AlunoId.ToString() + ".jpg", FileMode.OpenOrCreate, FileAccess.Write);
bw = new BinaryWriter(fs);
IndiceInicio = 0;
nBytesRetornados = reader.GetBytes(1, IndiceInicio, DadosImagem, 0, TamanhoBuffer);
while ((nBytesRetornados == TamanhoBuffer)) {
bw.Write(DadosImagem);
bw.Flush();
IndiceInicio += TamanhoBuffer;
nBytesRetornados = reader.GetBytes(1, IndiceInicio, DadosImagem, 0, TamanhoBuffer);
}
bw.Close();
fs.Close();
}
reader.Close();
con.Close();
bckwrk1.RunWorkerAsync();
} catch (Exception ex) {
MessageBox.Show("Erro :" + ex.Message);
}
}
|
Agora no evento DoWork do controle
BackGroundWorker defina o código abaixo que obtém as imagens do diretório
Imagens e as exibe no picturebox:
Private Sub bckwrk1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bckwrk1.DoWork
For Each img As String In Directory.GetFiles("Imagens")
picImagens.BackgroundImage = Image.FromFile(img)
picImagens.BackgroundImageLayout = ImageLayout.Zoom
Thread.Sleep(1000)
Next
End Sub
|
A versão C# do código acima é dado a seguir:
private void bckwrk1_DoWork(object
sender, System.ComponentModel.DoWorkEventArgs e) { foreach (string img in Directory.GetFiles("Imagens")) { picImagens.BackgroundImage = Image.FromFile(img); picImagens.BackgroundImageLayout = ImageLayout.Zoom; Thread.Sleep(1000); } } |
Para concluir digite no evento RunWorkerCompleted do controle BackGroundWorker o código abaixo:
Private Sub bckwrk1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bckwrk1.RunWorkerCompleted
bckwrk1.RunWorkerAsync()
End Sub
|
private void bckwrk1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
bckwrk1.RunWorkerAsync();
}
|
Para poder chamar o formulário form2.vb a partir do formulário form1.vb vamos incluir um botão de comando - btnVerImagens - no formulário form1.vb conforme a figura abaixo:
Inclua o código a seguir no evento Click deste botão:
Private Sub btnVerImagens_Click(sender As Object, e As EventArgs) Handles btnVerImagens.Click
My.Forms.Form2.Show()
End Sub
|
Agora
executando o projeto e clicando no botão Ver Imagens veremos o formulário form2.vb
ser apresentando.
Clicando no botão de comando - Acessar Imagens e Exibir Slide
Show - iremos o visualizar as imagens gravadas no banco de dados MySQL:
Pegue o projeto completo aqui: Imagens_MySQL_2.zip
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Posso distribuir o MySQL livremente com minhas aplicações VB ?