VB .NET - Inserindo imagens em um banco de dados MySQL - I


 Neste artigo eu vou mostrar como podemos inserir imagens em um banco de dados MySQL usando a linguagem VB .NET em um projeto Windows Forms.

Nível :  Básico

Podemos incluir imagens em qualquer banco de dados relacional usando a linguagem VB .NET e hoje a vítima vai ser o MySQL.

Vou fazer uma lista dos recursos que você vai precisar:

Primeiro você tem que ter o banco de dados MySQL instalado na sua máquina local e para isso você vai ter que baixá-lo da internet.

Agora atenção, você deve baixar a versão Community Server que é grátis, então baixe neste link: http://dev.mysql.com/downloads/mysql/

Você vai precisar de uma ferramenta para administrar o MySQL, criar o banco de dados, as tabelas e realizar outras tarefas. Pegue o MySQL Workbench neste link: http://dev.mysql.com/downloads/workbench/

Para poder acessar o MySQL a partir da plataforma .NET você vai precisar do MySQL Connector/NET que pode ser baixado aqui : http://dev.mysql.com/downloads/connector/net/

Você então vai ter que baixar e instalar esses recursos no seu computador antes de poder fazer qualquer outra tarefa.

Recursos usados

Criando o banco de dados e a tabela de Usuarios

Vamos começar criando o banco de dados e a tabela que iremos usar no projeto usando a ferramenta MySQL WorkBench.

Abrindo a ferramenta será apresentada a seguinte janela:

Observe que a janela já exibe uma instância local do MySQL instalado com o usuário root e o servidor localhost e a porta 3306.

Clicando nesta figura será solicitada a senha de acesso a instância local deste MySQL :

Acessando a instância veremos um menu com várias opções na parte superior esquerda e a área SCHEMAS, ou banco de dados, na parte inferior esquerda:

Para criar um novo banco de dados clique com o botão direito do mouse sobre a área SCHEMAS e a seguir clique em Create Schema...:

Informe o nome escola e clique no botão Apply;

Será apresentando o Script que irá criar o banco de dados; clique novamente em Apply;

Você verá na área SCHEMAS (após dar um Refresh) o banco de dados escola criado;

Para criar uma tabela neste banco de dados, expanda os objetos e clique com o botão direito do mouse sobre Tables e a seguir clique em Create Table: (selecione o schema escola antes)

Informe o nome alunos e defina os seguintes campos para esta tabela:

Conforme mostra a figura abaixo.

Note que o campo Id é do tipo chave primária e do tipo auto incremental.

Para criar a tabela clique no botão Apply.

Será apresentada a tabela com o Script gerado,e , para confirmar clique em Apply:

Ao final você deverá visualizar na área SCHEMAS da ferramenta MySQL WorkBench a tabela alunos e suas colunas :

Nota: Para alterar o nome de uma tabela, clique com o botão direito sobre a tabela e a seguir clique em Alter Table.

Como você percebeu criamos um campo chamado imagem na tabela alunos do tipo MEDIUMBLOB para armazenar as imagens.

Para armazenar imagens podemos usar qualquer tipo de dados BLOB com base nas nossas necessidades.

Eu usei o tipo de dados MEDIUMBLOB pois vou armazenar imagens de tamanho médio.

Veja abaixo os demais tipos e suas capacidades de armazenamento:

Tipo de Dados Capacidade
BLOB 255 bytes
TINYBLOB 65,535 bytes (64 KB aprox.)
MEDIUMBLOB 16,777,215 bytes (16 MB aprox.)
LONGBLOB 4,294,967,295 bytes (4 GB aprox.)

Criando o projeto Windows Forms

Abra o  Visual Studio 2013 Express for Windows dekstop e clique em New Project;

 

A seguir selecione o template Visual Basic -> Windows Forms Application e informe o nome Imagens_MySQL e clique no botão OK;

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 incluir uma referência ao MySQL Connector/Net em nosso projeto.

Vamos fazer isso usando o Nuget e podemos usar o Manager Console e digitar :   Install-Package MySql.Data

Ou você pode clicar no menu TOOLS -> Nuget Package Manager -> Manage Nuget Packages for Solution...

E selecionar MySQL.Data na janela - Manage Nuget Packages , clicando no botão Install para instalar a biblioteca no seu projeto:

Agora vamos declarar no formulário form1.vb os namespaces abaixo para acessar as classes dos provedores .NET para o MySQL :

Imports MySql.Data.MySqlClient
Imports
System.IO

Vamos definir uma variável no início do formulário para armazenar o nome da imagem selecionada:

Dim nomeArquivoImagem As String

Agora no evento Click do botão de comando btnLocalizar vamos incluir o código que permite ao usuário selecionar um arquivo imagem:


VB.NET :

Private Sub btnLocalizar_Click(sender As Object, e As EventArgs) Handles btnLocalizar.Click
        Try
            Dim ofd1 As New OpenFileDialog()
            ofd1.Filter = "Imagens | *.jpg"
            If ofd1.ShowDialog() = DialogResult.OK Then
                nomeArquivoImagem = ofd1.FileName
                picFoto.Image = Image.FromFile(ofd1.FileName)
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
End Sub	
C#
private void btnLocalizar_Click(object sender, EventArgs e)
{
	try {
		OpenFileDialog ofd1 = new OpenFileDialog();
		ofd1.Filter = "Imagens | *.jpg";
		if (ofd1.ShowDialog() == DialogResult.OK) {
			nomeArquivoImagem = ofd1.FileName;
			picFoto.Image = Image.FromFile(ofd1.FileName);
		}
	} catch (Exception ex) {
		MessageBox.Show(ex.Message);
	}
}

 

 

Finalmente no evento Click do botão btnSalvar temos o código que irá obter as informações e salvar os dados e a imagem na tabela alunos do banco de dados escola do MySQL:
 

Private Sub btnSalvar_Click(sender As Object, e As EventArgs) Handles btnSalvar.Click
        Dim _conexaoMySQL As String = "server=localhost;user id=root;password=*******;database=escola"
        Dim con As MySqlConnection = New MySqlConnection(_conexaoMySQL)
        Dim cmd As MySqlCommand
        Dim fs As FileStream
        Dim br As BinaryReader
        Try
            If txtNome.Text.Length > 0 And txtEmail.Text.Length > 0 Then
                Dim NomeArquivoFoto As String = nomeArquivoImagem
                Dim DadosImagem() As Byte
                fs = New FileStream(NomeArquivoFoto, FileMode.Open, FileAccess.Read)
                br = New BinaryReader(fs)
                DadosImagem = br.ReadBytes(CType(fs.Length, Integer))
                br.Close()
                fs.Close()
                Dim CmdSql As String = "INSERT INTO alunos(nome, email, imagem) VALUES(@Nome, @Email, @Imagem)"
                cmd = New MySqlCommand(CmdSql, con)
                cmd.Parameters.Add("@Nome", MySqlDbType.VarChar, 100)
                cmd.Parameters.Add("@Email", MySqlDbType.VarChar, 150)
                cmd.Parameters.Add("@Imagem", MySqlDbType.Blob)
                cmd.Parameters("@Nome").Value = txtNome.Text
                cmd.Parameters("@Email").Value = txtEmail.Text
                cmd.Parameters("@Imagem").Value = DadosImagem
                con.Open()
                Dim linhasAfetadas As Integer = cmd.ExecuteNonQuery()
                If (linhasAfetadas > 0) Then
                    MessageBox.Show("A imagem foi salva com sucesso !", "Salvar Imagem", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            Else
                MessageBox.Show("Dados incompletos !", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
        Catch ex As Exception
            MsgBox(ex.ToString())
        Finally
            If con.State = ConnectionState.Open Then
                con.Close()
            End If
        End Try
    End Sub

A versão C# do código acima é dado a seguir:

private void btnSalvar_Click(object sender, EventArgs e)
{
	string _conexaoMySQL = "server=localhost;user id=root;password=*******;database=escola";
	MySqlConnection con = new MySqlConnection(_conexaoMySQL);
	MySqlCommand cmd = default(MySqlCommand);
	FileStream fs = default(FileStream);
	BinaryReader br = default(BinaryReader);
	try {
		if (txtNome.Text.Length > 0 & txtEmail.Text.Length > 0) {
			string NomeArquivoFoto = nomeArquivoImagem;
			byte[] DadosImagem = null;
			fs = new FileStream(NomeArquivoFoto, FileMode.Open, FileAccess.Read);
			br = new BinaryReader(fs);
			DadosImagem = br.ReadBytes(Convert.ToInt32(fs.Length));
			br.Close();
			fs.Close();
			string CmdSql = "INSERT INTO alunos(nome, email, imagem) VALUES(@Nome, @Email, @Imagem)";
			cmd = new MySqlCommand(CmdSql, con);
			cmd.Parameters.Add("@Nome", MySqlDbType.VarChar, 100);
			cmd.Parameters.Add("@Email", MySqlDbType.VarChar, 150);
			cmd.Parameters.Add("@Imagem", MySqlDbType.Blob);
			cmd.Parameters("@Nome").Value = txtNome.Text;
			cmd.Parameters("@Email").Value = txtEmail.Text;
			cmd.Parameters("@Imagem").Value = DadosImagem;
			con.Open();
			int linhasAfetadas = cmd.ExecuteNonQuery();
			if ((linhasAfetadas > 0)) 
                                       {
				MessageBox.Show("A imagem foi salva com sucesso !", "Salvar Imagem", MessageBoxButtons.OK, MessageBoxIcon.Information);
			}
		} else {
			MessageBox.Show("Dados incompletos !", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
	} catch (Exception ex) {
		Interaction.MsgBox(ex.ToString());
	} finally {
		if (con.State == ConnectionState.Open) {
			con.Close();
		}
	}
}

Executando o projeto e informando alguns dados e selecionando uma foto teremos o seguinte resultado :

Ao clicar no botão - Salvar Dados - os dados serão salvos e podemos verificar isso abrindo alunos a tabela no MySQL WorkBench e visualizando os dados da tabela:

Como esse é um exemplo básico eu coloquei o código de acesso aos dados no formulário mas essa prática deve ser desencorajada.

As boas práticas de programação sugerem que devemos separar o código de acesso aos dados da camada de apresentação e separar as responsabilidades.

Então o mais correto seria criar um outro projeto e nele definir a camada de acesso aos dados com classes para acessar e persistir dados no MySQL.

Que tal fazer isso para se exercitar ?

Veja o meu artigo http://www.macoratti.net/09/08/c_mysql1.htm para ter uma base de como fazer isso.

No próximo artigo irei mostrar como acessar e ler as imagens da tabela alunos.

Pegue o projeto completo aqui:   Imagens_MySQL.zip

E, estando ele em Jerusalém pela páscoa, durante a festa, muitos, vendo os sinais que fazia, creram no seu nome.
Mas o mesmo Jesus não confiava neles, porque a todos conhecia;
E não necessitava de que alguém testificasse do homem, porque ele bem sabia o que havia no homem.

João 2:23-25

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