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#)

Clique e Confira

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 :

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.MySqlClient
Imports
System.IO
Imports System.Threading

Agora 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:


José Carlos Macoratti