WPF -  Salvando e Recuperando imagens em um Banco de dados - II


 Neste artigo eu vou mostrar como podemos armazenar e recuperar imagens em um banco de dados SQL Server em uma aplicação WPF usando a linguagem VB .NET.

Na primeira parte do artigo definimos o modelo de dados, criamos a solução WPF e o menu da aplicação. Neste artigo eu vou definir a janela SalvarImagem.xaml onde irei implementar as funcionalidades para salvar imagens no banco de dados.

Recursos usados:

Implementando as funcionalidades para salvar imagens

Abra o projeto criado na primeira parte do artigo e a seguir abra o arquivo SalvarImagem.xaml e inclua os seguintes controles a partir da ToolBox:

Defina os controles conforme o leiaute da figura abaixo

O código XAML gerado é visto abaixo:

<Window x:Class="SalvarImagem"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Salvar Imagens" Height="500" Width="600" WindowStartupLocation="CenterScreen">
    <Grid Background="Aqua">
        <TextBox x:Name="txtArquivo" HorizontalAlignment="Left" Height="23" Margin="51,374,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="432"/>
        <Button x:Name="btnProcurar" Content="Procurar" HorizontalAlignment="Left" Margin="488,374,0,0" VerticalAlignment="Top" Width="75" Background="#FF9A9AC1" Click="btnProcurar_Click"/>
        <Button x:Name="btnSalvar" Content="Salvar a imagem no Banco de dados" HorizontalAlignment="Left" Margin="51,402,0,0" VerticalAlignment="Top" Width="432" Background="#FF9898CF"  Click="btnSalvar_Click"/>
        <Button x:Name="btnSair" Content="Sair" HorizontalAlignment="Left" Margin="488,402,0,0" VerticalAlignment="Top" Width="75" Background="#FFAEAED6" Click="btnSair_Click"/>
        <Image x:Name="imgArquivo" HorizontalAlignment="Left" Height="309" Margin="51,29,0,0" VerticalAlignment="Top" Width="432" ToolTip="Selecione a imagem para Salvar" />
        <Label x:Name="lblmsg" Content="" HorizontalAlignment="Left" Margin="51,429,0,0" VerticalAlignment="Top" Width="432" Height="30"/>
    </Grid>
</Window>

Observe que a janela SalvarImagem será exibida centralizada : WindowStartupLocation="CenterScreen" e que definimos os eventos Click para cada controle Button.

Vamos declarar os seguintes namespaces que iremos usar nesta janela:

Imports Microsoft.Win32

Imports System.IO

Imports System.Data.SqlClient

Imports System.Data

Agora vamos definir o código em cada um dos eventos Click.

1- Código do evento Click do botão Procurar -

 Private Sub btnProcurar_Click(sender As Object, e As RoutedEventArgs)
        lblmsg.Content = ""
        imgArquivo.Source = Nothing
        Dim FileDialog As New OpenFileDialog
        Try
            FileDialog.Title = "Selecione um Arquivo"
            FileDialog.InitialDirectory = ""
            FileDialog.Filter = "Image Files (*.gif,*.jpg,*.jpeg,*.bmp,*.png)|*.gif;*.jpg;*.jpeg;*.bmp;*.png"
            FileDialog.FilterIndex = 1
            FileDialog.ShowDialog()

            txtArquivo.Text = FileDialog.FileName()
            lblmsg.Content = NomeArquivo(txtArquivo.Text.Trim)

            Dim bmp As New BitmapImage(New Uri(txtArquivo.Text.Trim))
            If bmp.Width < 484 And bmp.Height < 268 Then
                imgArquivo.Stretch = Stretch.None
                imgArquivo.VerticalAlignment = Windows.VerticalAlignment.Center
                imgArquivo.HorizontalAlignment = Windows.HorizontalAlignment.Center
                imgArquivo.Source = bmp
            Else
                imgArquivo.Stretch = Stretch.Uniform
                imgArquivo.VerticalAlignment = Windows.VerticalAlignment.Center
                imgArquivo.HorizontalAlignment = Windows.HorizontalAlignment.Center
                imgArquivo.Source = bmp
            End If
        Catch ex As Exception
            lblmsg.Content = "Você não selecionou nenhum arquivo Imagem..."
        End Try
    End Sub

Este código abra uma caixa de diálogo que permite selecionar uma imagem exibindo-a a seguir no controle PictureBoximgArquivo - do formulário:

O código utiliza o método NomeArquivo() cujo objetivo é apenas extrair o home do arquivo do caminho completo de sua localização:

  Private Function NomeArquivo(ByVal Pth As String) As String
        Dim posicaoBarra As Integer = Pth.LastIndexOf("\")
        Dim _nomeArquivo As String = Pth.Substring(posicaoBarra + 1)
        Return _nomeArquivo
  End Function

Após selecionar a imagem o usuário clica no botão - Salvar a imagem no banco de dados - para armazenar a imagem na tabela Imagens:

 Private Sub btnSalvar_Click(sender As Object, e As RoutedEventArgs)
        Try
            lblmsg.Content = ""
            Dim Stream As FileStream
            Dim Reader As StreamReader
            Stream = New FileStream(txtArquivo.Text, FileMode.Open, FileAccess.Read)
            Reader = New StreamReader(Stream)
            Dim ImgData(Stream.Length - 1) As Byte
            Stream.Read(ImgData, 0, Stream.Length - 1)
            Dim str As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Cadastro;Integrated Security=True"
            Dim con As New SqlConnection(str)
            Dim sql As String = "INSERT INTO Imagens (imagemNome, Imagem) VALUES(@ImagemNome, @Imagem)"
            Dim cmd As New SqlCommand(sql, con)
            cmd.Parameters.Add("@ImagemNome", SqlDbType.Text).Value = NomeArquivo(txtArquivo.Text.Trim)
            cmd.Parameters.Add("@Imagem", SqlDbType.Binary, Stream.Length).Value = ImgData
            con.Open()
            cmd.ExecuteNonQuery()
            lblmsg.Content = " O arquivo   " & NomeArquivo(txtArquivo.Text.Trim) & "  foi armazenado com sucesso...."
            con.Close()
        Catch ex As Exception
            lblmsg.Content = ex.Message
        End Try
    End Sub

O código acima abre o arquivo criando um stream e a seguir um array de bytes.

A seguir , usando ADO .NET, definimos a string de conexão com o banco de dados e a instrução SQL INSERT INTO para incluir os dados na tabela.

Atribuímos os parâmetros para o objeto parameters, e usamos o método ExecuteNonQuery() para executar a instrução SQL.

Na conclusão do artigo irei definir o código da janela RecuperarImagem.

Já estou crucificado com Cristo; e vivo, não mais eu, mas Cristo vive em mim; e a vida que agora vivo na carne, vivo-a pela fé do Filho de Deus, o qual me amou, e se entregou a si mesmo por mim.(apóstolo Paulo)
Gálatas 2:20

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti