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-10Referências: