C# - Armazenando e Recuperando Imagens do SQL Server


Neste artigo vamos armazenar e recuperar imagens de um banco de dados SQL Server.

Eu já escrevi alguns artigos sobre o assunto, todos eles usando a linguagem VB .NET e hoje eu volto ao assunto mostrando como fazer isso usando a linguagem C#.

Vou usar os seguintes recursos:

Criando o projeto Windows Forms

Abra o Visual C# 2010 Express Edition e no menu File clique em New Project;

Selecione o template Windows Forms Application e informe o nome TratandoImagens_SQLServer;

A seguir inclua, a partir da ToolBox, os seguintes controles no formulário form1.cs:

O leiaute do formulário deverá se parecer com o da figura abaixo:

Vamos definir os seguintes namespaces no formulário:

using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;

Temos que definir também as seguintes variáveis logo após a declaração do formulário:

private long tamanhoArquivoImagem = 0;
private byte[] vetorImagens;
private SqlConnection conexaoSQLServer;
SqlCommand sqlcmd = default(SqlCommand);

Criando o banco de dados no SQL Server

Vamos criar o banco de dados e tabela no SQL Server.

Eu poderia fazer isso usando o SQL Server Management Studio mas vou usar o próprio ambiente do Visual C# 2010 Express Edition;

Abra a janela DataBase Explorer e clique com o botão direito em Data Connections clicando a seguir em Add Connection;

Na janela Add Connection , clique no botão Change e altere o Data Source para : Microsoft SQL Server Database File;

Obs: Esta janela poderá exibir outras opções de Data Source mas eu escolhi trabalhar com um banco de dados anexado ao meu SQL Server Local;

Informe o nome do banco de dados, no exemplo o nome usado foi Cadastro.mdf e clique no botão OK;

Uma caixa de diálogo irá surgir informando que o banco de dados não existe e se você deseja criá-lo. Confirme e clique no botão Sim para criar o banco de dados.

Você verá na janela DataBase Explorer o banco de dados Cadastro;

Clique com o botão direito no item Tables e a seguir clique em Add New Table;

Crie a tabela Imagens definindo os campos:

Assim temos o banco de dados Cadastro.mdf e a tabela Imagens criadas e prontas para serem usadas.

Recuperando imagens do banco de dados

A primeira coisa que vamos fazer é acessar a tabela Imagens do banco de dados e exibir o seu conteúdo no controle DataGridViw (gdvImagens);

Faremos isso quando o usuário clicar no botão Ativar, visto que ele será forçado a clicar neste botão para ativar os botões de comando do formulário;

No evento Click do botão Ativar inclua o código abaixo:

  private void btnAtivar_Click(object sender, EventArgs e)
        {
            //cria uma instãncia do objeto SqlConnection
            conexaoSQLServer = new SqlConnection(txtStringConexaoBD.Text);
            //obtem os dados da tabela imagens
            getImagensSQLServer(conexaoSQLServer);
            //ativa os botões de comando
            btnCarregarImagem.Enabled = true;
            btnRetornarImagemBD.Enabled=true;
            btnSalvarImagemBD.Enabled = true;
            btnAtivar.Enabled = false;
        }

A rotina getImagensSQLServer obtém as imagens do SQL Server e tem o seguinte código:

 void getImagensSQLServer(SqlConnection conexaoSQLServer)
        {
            try
            {
                //Inicializar o SQL adapter.
                SqlDataAdapter ADAP = new SqlDataAdapter("Select Id,descricao,imagem from Imagens", conexaoSQLServer);

                //Inicializa o  Dataset.
                DataSet DS = new DataSet();

                //Preenche o dataset com a tabela Imagens
                ADAP.Fill(DS, "Imagens");

                //preenche o datagridviewe com o dataset.
                gdvImagens.DataSource = DS.Tables["Imagens"];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

No evento Click da célula do DataGridView vamos definir o código para que os controles TextBox para o código e descrição da imagem sejam limpos e que o código da imagem seja obtido da célula do Grid e exibido no controle TextBox que exibe o código da imagem;

 private void gdvImagens_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //obtem o codigo da imagem e exibe no controle textbox 
            txtCodigoImagem.Text = (gdvImagens.Rows[e.RowIndex].Cells["id"].Value).ToString();
            txtDescricaoImagem.Text = "";
        }

Dessa forma o usuário poderá recuperar uma imagem do banco de dados usando o código com o qual ela foi salva.

Para salvar uma nova imagem no banco de dados o usuário deverá clicar no botão - Carregar Imagem.

Isso abrirá uma caixa de diálogo para que uma imagem seja selecionada e exibida no controle PictureBox (picImagem);

O código que faz isso esta no evento Click do botão - Carregar Imagem - conforme mostrado a seguir:

 private void btnCarregarImagem_Click(object sender, EventArgs e)
        {
            CarregaImagem();
            txtCodigoImagem.Text = "";
            txtDescricaoImagem.Text = "";
        }

A rotina CarregaImagem() é quem realmente faz o serviço de obter o nome da imagem e exibi-la no PictureBox. O seu código é dado abaixo:

 protected void CarregaImagem()
        {
            try
            {
                this.openFileDialog1.ShowDialog(this);
                string strFn = this.openFileDialog1.FileName;

                if (string.IsNullOrEmpty(strFn))
                    return;

                this.picImagem.Image = Image.FromFile(strFn);
                FileInfo arqImagem = new FileInfo(strFn);
                tamanhoArquivoImagem = arqImagem.Length;
                FileStream fs = new FileStream(strFn, FileMode.Open,FileAccess.Read, FileShare.Read);
                vetorImagens = new byte[Convert.ToInt32(this.tamanhoArquivoImagem)];
                int iBytesRead = fs.Read(vetorImagens, 0, Convert.ToInt32(this.tamanhoArquivoImagem));
                fs.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Salvando uma imagem no SQL Server

Para salvar uma nova imagem na tabela Imagens do banco de dados Cadastro.mdf o usuário terá que carregar uma nova imagem e fornecer uma descrição para ela.

Ele não vai precisar informar o código da imagem pois o campo id é do tipo identity sendo assim incrementado automaticamente pelo SGBD.

O código que salva a imagem esta no evento Click do botão - Salvar imagem no banco de dados:

 private void btnSalvarImagemBD_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtDescricaoImagem.Text))
            {
                MessageBox.Show("Informe a descrição da imagem", "Código da Imagem", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            try
            {
                this.conexaoSQLServer.Open();
                this.sqlcmd = new SqlCommand();
                sqlcmd.Connection = conexaoSQLServer;
                if (sqlcmd.Parameters.Count == 0)
                {
                    this.sqlcmd.CommandText = "INSERT INTO Imagens(descricao,imagem) values(@descricao,@imagem)";
                    this.sqlcmd.Parameters.Add("@descricao", System.Data.SqlDbType.VarChar, 50);
                    this.sqlcmd.Parameters.Add("@imagem", System.Data.SqlDbType.Image);
                }
                this.sqlcmd.Parameters["@descricao"].Value = this.txtDescricaoImagem.Text;
                this.sqlcmd.Parameters["@imagem"].Value = this.vetorImagens;

                int iresultado = this.sqlcmd.ExecuteNonQuery();
                
                if (iresultado <= 0)
                    MessageBox.Show("Falha ao incluir imagem no banco de dados.");

                getImagensSQLServer(conexaoSQLServer);

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                this.conexaoSQLServer.Close();
            }
        }

Recuperando uma imagem no SQL Server

Para recuperar uma imagem do banco de dados o usuário deverá informar o seu código. Ele pode selecionar o código a partir do DataGridView ou informando manualmente.

O código que recupera a imagem e a exibe no PictureBox esta no evento Click do botão - Obter imagem do banco de dados:

   private void btnRetornarImagemBD_Click(object sender, EventArgs e)
        {
            if (txtCodigoImagem.Text == string.Empty)
            {
                MessageBox.Show("Informe o código da imagem no Banco de dados", "Código da Imagem", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            try
            {
                SqlCommand cmdSelect = new SqlCommand("select imagem from Imagens where id=@ID", this.conexaoSQLServer);
                cmdSelect.Parameters.Add("@ID", SqlDbType.Int, 4);
                cmdSelect.Parameters["@ID"].Value = this.txtCodigoImagem.Text;

                this.conexaoSQLServer.Open();
                byte[] vetorImagem = (byte[])cmdSelect.ExecuteScalar();
                string strNomeArquivo = Convert.ToString(DateTime.Now.ToFileTime());
                FileStream fs = new FileStream(strNomeArquivo, FileMode.CreateNew, FileAccess.Write);
                fs.Write(vetorImagem, 0, vetorImagem.Length);
                fs.Flush();
                fs.Close();

                picImagem.Image = Image.FromFile(strNomeArquivo);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                this.conexaoSQLServer.Close();
            }
        }

Executando o projeto incluir e recuperar imagens na tabela Imagens conforme mostra o resultado obtido na figura abaixo:

Pegue o projeto completo aqui: TratandoImagens_SQLServer.zip

Rom 15:4 Porquanto, tudo que dantes foi escrito, para nosso ensino foi escrito, para que, pela constância e pela consolação provenientes das Escrituras, tenhamos esperança.
Rom 15:5
Ora, o Deus de constância e de consolação vos dê o mesmo sentimento uns para com os outros, segundo Cristo Jesus.

Rom 15:6
Para que unânimes, e a uma boca, glorifiqueis ao Deus e Pai de nosso Senhor Jesus Cristo.

Referências:


José Carlos Macoratti