C# - Exibindo imagens armazenadas no SQL Server


No artigo - C# - Armazenando Imagens no SQL Server  - eu mostrei como podemos armazenar imagens .gif e .jpg diretamente em um banco de dados SQL Server.

Este artigo complementa o artigo anterior mostrando como podemos acessar as imagens armazenadas exibindo-as em uma aplicação Windows Forms usando a linguagem C# com o Visual C# 2010 Express Edition.

Vamos então aproveitar o banco de dados, a tabela e o projeto criados no artigo citado e incluir a funcionalidade de acessar e exibir imagens que foram armazenadas.

Dessa forma iremos acessar a tabela Imagens  usada para armazenar as imagens usando a string de conexão já definida no arquivo App.Config.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <clear />
    <add name="conexaoSQLServer"
     providerName="System.Data.SqlClient"
     connectionString="server =.\SQLEXPRESS;integrated security = true;database=JcmSoft;" />
  </connectionStrings>
</configuration>
Figura 1.0

Abrindo e ajustando o projeto Windows Forms

Abra o Visual C# 2010 Express Edition e no menu File selecione Open Project e a seguir o selecione o projeto InserindoImagens clicando no botão OK;

Vamos incluir um novo formulário e definir sua propriedade isMDIContainer como True de forma que ele será o formulário MDI pai do projeto e os demais formulários serão os formulários filhos.

Para incluir um novo formulário no projeto selecione o menu Project e clique em Add Windows Forms e informando o nome Menu.cs e clicando no botão Add;

Selecione o formulário Menu.cs recém criado e defina sua propriedade isMDIContainter como true; A seguir inclua um controle MenuStrip no formulário e define um menu conforme o leiaute abaixo:

No menu Imagens temos uma opção para Inserir imagens que já abordarmos no artigo C# - Armazenando Imagens no SQL Server e a opção para Exibir imagens que iremos tratar neste artigo.

Para isso vamos incluir um novo formulário no projeto a partir do menu Project -> Add Windows Forms aceitando o nome padrão Form2.cs;

No formulário Menu.cs vamos definir o código que permitirá abrir o formulário Form1.cs para inserir imagens e o formulário Form2.cs para exibir imagens que iremos construir neste artigo. O código completo do formulário Menu.cs pode ser visto abaixo:

using System;
using System.Windows.Forms;
namespace Macoratti
{
    public partial class Menu : Form
    {
        public Menu()
        {
            InitializeComponent();
        }
        private void inserirImagensToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Cria uma nova instância do formulário filho
            Form1 frmInserir = new Form1();
            //Define o formulário pai para o filho
            frmInserir.MdiParent = this;
            //Exibe o filho
            frmInserir.Show();
        }
        private void exibirImagensToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Cria uma nova instância do formulario filo MDI
            Form2 frmExibir = new Form2();
            //Define o formulário pai para o filho
            frmExibir.MdiParent = this;
            //Exibe o filho
            frmExibir.Show();
        }
    }
}

Este código apenas cria instâncias dos formulários que desejamos abrir e define o seu formulário Pai abrindo o formulário.

Acessando e exibindo imagens armazenadas no SQL Server

Vamos agora definir o leiaute do formulário Form2.cs onde iremos exibir as imagens armazenadas.

Vamos incluir no formulário Form2.cs um controle TextBox (txtArquivo), um controle Button (btnExibir), um controle PictureBox (picImagem) e um controle Label(lblCaminho) conforme o leiaute abaixo:

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.

 

O usuário deverá informar o nome da imagem na caixa de texto e clicar no botão - Exibir Imagem - para exibir a imagem no controle PictureBox e o seu caminho no controle Label.

Obs: Eu fiz uma pequena alteração no projeto inicial para que a tabela Imagens pudesse armazenar o nome do arquivo e o caminho do arquivo em campos distintos. A tabela Imagens passou a ter 3 campos : nome, caminho e imagem.

Vamos agora incluir uma classe no projeto selecionando o menu Project -> Add Class e selecionando o template Class, informando o nome MostraImagem.cs e clicando no botão Add;

A seguir vamos definir os métodos da classe MostraImagem conforme abaixo:

using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Configuration;
namespace Macoratti
{
    public class MostraImagem
    {
        string momeArquivoImagem = null;
        string nomeCaminhoImagem = null;
        byte[] imagemBytes = null;

        SqlConnection imagemConexao = null;
        SqlCommand imagemCommand = null;
        SqlDataReader imagemReader = null;
        static string GetStringConexaoPorNome(string nome)
        {
            //define a variável
            string retorno = null;
            // Procura pelo nome na seção  connectionStrings do app.config
            ConnectionStringSettings configuracao =
                ConfigurationManager.ConnectionStrings[nome];
            // se achou retorna a string de conexçao
            if (configuracao != null)
                retorno = configuracao.ConnectionString;
            return retorno;
        }
        //
        public MostraImagem(string nome)
        {
            imagemConexao = new SqlConnection(GetStringConexaoPorNome("conexaoSQLServer"));
            imagemCommand = new SqlCommand(@"select nome,caminho,imagem from Imagens where nome = '" + nome + "'", imagemConexao);
            // abre a conexão e cria o datareader
            imagemConexao.Open();
            imagemReader = imagemCommand.ExecuteReader();
        }
        // constructor
        public MostraImagem()
        {
            imagemConexao = new SqlConnection(GetStringConexaoPorNome("conexaoSQLServer"));
            imagemCommand = new SqlCommand(@"select nome,caminho, imagem from Imagens",imagemConexao);
            // abre a conexão e cria o datareader
            imagemConexao.Open();
            imagemReader = imagemCommand.ExecuteReader();
        }
        public Bitmap GetImagem()
        {
            MemoryStream ms = new MemoryStream(imagemBytes);
            Bitmap bmap = new Bitmap(ms);
            return bmap;
        }
        public string GetFilename()
        {
            return momeArquivoImagem;
        }
        public string GetPathname()
        {
            return nomeCaminhoImagem;
        }
        public bool GetRow()
        {
            if (imagemReader.Read())
            {
                momeArquivoImagem = (string)imagemReader.GetValue(0);
                nomeCaminhoImagem = (string)imagemReader.GetValue(1);
                imagemBytes = (byte[])imagemReader.GetValue(2);
                return true;
            }
            else
            {
                return false;
            }
        }
        public void EncerraImagem()
        {
            // fecha o reader e a conexao.
            imagemReader.Close();
            imagemConexao.Close();
        }
    }
}
 

Na classe MostraImagem temos os seguintes métodos:

O código do formulário irá tratar o evento Click  do botão de comando Exibir Imagem e a inicialização do formulário conforme abaixo:

using System;
using System.Drawing;
using System.Windows.Forms;
namespace Macoratti
{
    public partial class Form2 : Form
    {
        MostraImagem mImagem = new MostraImagem();

        public Form2()
        {
            InitializeComponent();
            if (mImagem.GetRow())
            {
                this.txtArquivo.Text = mImagem.GetFilename();
                this.picImagem.Image = (Image)mImagem.GetImagem();
                this.lblCaminho.Text = mImagem.GetPathname();
            }
            else
            {
                this.txtArquivo.Text = "Não Encontrado";
                this.picImagem.Image = null;
            }
        }
        private void btnExibir_Click(object sender, EventArgs e)
        {
            MostraImagem mImagem = new MostraImagem(txtArquivo.Text.Trim());

            if (mImagem.GetRow())
            {
                this.txtArquivo.Text = mImagem.GetFilename();
                this.picImagem.Image = (Image)mImagem.GetImagem();
                this.lblCaminho.Text = mImagem.GetPathname();
            }
            else
            {
                this.txtArquivo.Text = "Não Encontrado";
                this.picImagem.Image = null;
            }
        }
        protected override void Dispose(bool disposing)
        {
            mImagem.EncerraImagem();
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

Destaques do código do formulário:

No inicio do formulário criamos uma instância da classe MostraImagem usando o construtor sem parâmetros pois não temos o nome da imagem;

Na inicialização do formulário invocamos o método GetRow que irá acessar o banco de dados e obter as informações da primeira imagem armazenada exibindo-a no formulário;

No evento Click do botão de comando criamos uma nova instância da classe MostraImagem usando o construtor onde passamos como parâmetro o nome da imagem a ser exibida;

Executando o projeto teremos:

Ao clicar na opção Exibir Imagens do menu o formulário Form2.cs irá acessar a primeira imagem armazenada no banco de dados exibindo-a no controle PictureBox; será exibindo também o seu caminho no controle Label:

Para exibir outra imagem basta informar o nome da imagem na caixa de texto e clicar no botão Exibir Imagem:

Eu sei que essa não é melhor forma de exibir as imagens visto que o usuário tem que saber o nome da mesma, mas você  pode melhorar este aspecto visto que o objetivo é mostrar como exibir a imagem e isso a aplicação esta fazendo de forma correta.

Pegue projeto completo aqui: InserindoImagens2.zip

"Se confessarmos os nossos pecados, ele é fiel e justo para nos perdoar os pecados e nos purificar de toda injustiça. Se dissermos que não temos cometido pecado, fazemo-lo mentiroso, e a sua palavra não está em nós." 1 João 1:9-10

Referências:


José Carlos Macoratti