WPF - Salvando e recuperando imagens do SQL Server (C#)
Neste tutorial vou mostrar como podemos salvar e recuperar imagens de um banco de dados SQL Server em uma aplicação WPF usando a linguagem C#.
1- Criando o projeto WPF
Abra o Visual C# 2010 Express Edition e crie um novo projeto do tipo WPF Application com o nome TratandoImagens_WPF;
Vamos criar um banco de dados chamado Cadastro.mdf e uma tabela Fotos com a seguinte estrutura:
A tabela possui um campo id chave primária do tipo identity e um campo imagem do tipo Image e um campo nome do tipo nvarchar().
Vamos selecionar o arquivo MainWindow.xaml e a partir da ToolBox vamos incluir nesta janela os controles:
Conforme o leiaute abaixo:
A formatação da cor de fundo da janela fica a seu critério. |
O código XAML gerado é visto abaixo:
<Window x:Class="TratandoImagens_WPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Inclui Imagens" Height="398" Width="525"> <Grid> <Grid.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="Black" Offset="0" /> <GradientStop Color="#101E3B74" Offset="1" /> <GradientStop Color="#DBE8C795" Offset="0.5" /> </LinearGradientBrush> </Grid.Background> <Image Height="246" HorizontalAlignment="Left" Margin="73,60,0,0" Name="imgArquivo" Stretch="Fill" VerticalAlignment="Top" Width="378" /> <TextBox Height="23" HorizontalAlignment="Left" Margin="73,31,0,0" Name="txtNome" VerticalAlignment="Top" Width="341" /> <Button Content="Salvar" Height="35" HorizontalAlignment="Left" Margin="268,312,0,0" Name="btnSalvar" VerticalAlignment="Top" Width="75" Click="btnSalvar_Click" /> <Button Content="Próximo" Height="35" HorizontalAlignment="Left" Margin="352,312,0,0" Name="btnProximo" VerticalAlignment="Top" Width="75" Click="btnProximo_Click" /> <Button Content="..." Height="23" HorizontalAlignment="Left" Margin="415,31,0,0" Name="btnProcurar" VerticalAlignment="Top" Width="36" Click="btnProcurar_Click" /> </Grid> </Window> |
No evento Click do botão Procurar vamos incluir o código abaixo para selecionar um arquivo Imagem:
private void btnProcurar_Click(object sender, RoutedEventArgs e) { Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); dlg.ShowDialog(); try { fs = new FileStream(dlg.FileName, FileMode.Open, FileAccess.Read); dadosImagem = new byte[fs.Length]; fs.Read(dadosImagem, 0, System.Convert.ToInt32(fs.Length)); fs.Close(); ImageSourceConverter imgs = new ImageSourceConverter(); imgArquivo.SetValue(Image.SourceProperty, imgs.ConvertFromString(dlg.FileName.ToString())); txtNome.Text = dlg.FileName.ToString(); } catch (Exception ex) { MessageBox.Show("Erro :: " + ex.Message); } } |
Executando o projeto e selecionando uma imagem teremos:
Para salvar a imagem basta clicar no botão Salvar cujo código é colocado no evento Click do controle Button conforme abaixo:
private void btnSalvar_Click(object sender, RoutedEventArgs e) { try { sqlCon = new SqlConnection(conStr); sqlCon.Open(); string sqlCmd = "INSERT INTO Fotos(imagem,nome) values(@imagem,@nome)"; SqlCommand sc = new SqlCommand(sqlCmd, sqlCon); sc.Parameters.AddWithValue("@imagem", dadosImagem); sc.Parameters.AddWithValue("@nome", txtNome.Text); sc.ExecuteNonQuery(); sc.Dispose(); sqlCon.Close(); MessageBox.Show("Imagem Salva "); } catch (Exception ex) { MessageBox.Show("Erro :: " + ex.Message); } } |
O código é bem simples :
1- Abrimos uma conexão com o banco de dados Cadastro usando a string de
conexão definida;
2- Criamos um objeto Command que usa a instrução SQL para incluir registros :
"INSERT INTO Fotos(imagem,nome) values(@imagem,@nome)";
3- Passamos os parâmetros que são : a imagem escolhida e e seu nome;
4- Executamos o comando na conexão : sc.ExecuteNonQuery();
E pronto. A imagem será salva no banco de dados.
No evento Click do botão Próximo iremos chamar uma nova janela para exibir as imagens salvas. O seu código é dado a seguir:
private
void
btnProximo_Click(object
sender, RoutedEventArgs
e)
{ Window1 oWin = new Window1(); oWin.Show(); this.Close(); }
|
Recuperando imagens salvas
Nosso próximo objetivo será recuperar as imagens salvas e exibi-las em uma nova janela da aplicação WPF.
Vamos incluir uma nova janela no projeto. No menu Project clique em Add Window e aceite o nome padrão Window1.xaml;
Selecione a janela Window1.xaml e inclua a partir da ToolBox os seguintes controles:
Conforme o leiaute abaixo:
O código xaml gerado é o seguinte:
<Window x:Class="TratandoImagens_WPF.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Visualizar Imagens" Height="482" Width="669"> <Grid> <Grid.Background> <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5"> <GradientStop Color="Black" Offset="0" /> <GradientStop Color="White" Offset="1" /> <GradientStop Color="#FFE9EFFC" Offset="0.5" /> <GradientStop Color="#FF71D871" Offset="0.25" /> </LinearGradientBrush> </Grid.Background> <TextBlock Height="23" HorizontalAlignment="Left" Margin="27,47,0,0" Name="txtbImagens" Text="Imagens Disponíveis" VerticalAlignment="Top" Width="174" Background="#C3FCEB17" FontSize="15" FontStretch="Normal" FontWeight="Medium" /> <ListBox Height="315" HorizontalAlignment="Left" Margin="27,76,0,0" Name="lstImagens" VerticalAlignment="Top" Width="174" Background="#80FEEFE4" /> <Image Height="344" HorizontalAlignment="Left" Margin="211,47,0,0" Name="imgImagem" Stretch="Fill" VerticalAlignment="Top" Width="416" /> <Button Content="Encerrar" Height="23" HorizontalAlignment="Left" Margin="552,399,0,0" Name="btnSair" VerticalAlignment="Top" Width="75" /> </Grid> </Window> |
Vamos definir o código da janela Window1.xaml.
Os namespaces usados na janela são:
using
System.Windows;using
System.Windows.Controls;using
System.Windows.Media.Imaging;using
System.IO;using
System.Data.SqlClient;using
System.Data;Vamos definir no início da janela as variáveis que serão visíveis por todo o código usado na janela:
DataSet ds = null;SqlConnection sqlCon = null;
string conStr = @"Data Source=.\SQLEXPRESS;Initial Catalog=Cadastro;Integrated Security=True;";
Agora no evento Loaded da janela vamos incluir o código abaixo:
private
void
Window_Loaded(object
sender, RoutedEventArgs
e)
{ sqlCon = new SqlConnection(conStr);sqlCon.Open(); ds = new DataSet();
sqa.Fill(ds); sqlCon.Close(); foreach (DataRow dataRow in ds.Tables[0].Rows) { ListBoxItem lbItem = new ListBoxItem(); lbItem.Content = dataRow[0].ToString(); lstImagens.Items.Add(lbItem); } } |
Este código abra uma conexão usando a string de conexão definida e obtém o nome das fotos armazenadas no banco de dados exibindo-as no controle ListBox - lstImagens;
Quando o botão Próximo da janela MainWindow.xaml form clicado a janela Window1.xaml será aberta e exibirá as imagens gravadas:
Selecionando uma imagem do controle ListBox a mesma será exibida no controle PictureBox da janela Window1.xaml:
Para isso devemos incluir o código abaixo no evento SelectionChanged do controle ListBox.
private void lstImagens_SelectionChanged(object sender, SelectionChangedEventArgs e) { SqlConnection sqlCon = new SqlConnection(conStr); ListBoxItem lb = (lstImagens.SelectedItem as ListBoxItem); sqlCon.Open(); ds = new DataSet(); SqlDataAdapter sqa = new SqlDataAdapter ("Select imagem from Fotos where nome='" + lb.Content.ToString() + "'", sqlCon); sqa.Fill(ds); sqlCon.Close(); byte[] data = (byte[]) ds.Tables[0].Rows[0][0]; MemoryStream strm = new MemoryStream(); strm.Write(data, 0, data.Length); strm.Position = 0; System.Drawing.Image img = System.Drawing.Image.FromStream(strm); BitmapImage bi = new BitmapImage(); bi.BeginInit(); MemoryStream ms = new MemoryStream(); img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); ms.Seek(0, SeekOrigin.Begin); bi.StreamSource = ms; bi.EndInit(); imgArquivo.Source = bi; } |
Com isso mostrei como salvar e recuperar imagens em um banco de dados SQL Server usando a linguagem C# em uma aplicação WPF>
Pegue o projeto completo aqui: TratandoImagens_WPF.zip
1Pedro 5:6
Humilhai-vos, pois, debaixo da potente mão de Deus, para que a seu tempo vos exalte;Referências: