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