VB .NET - Armazenando documentos PDF em um banco de dados
Este artigo mostra uma forma de armazenar e recuperar documentos PDF em um banco de dados SQL Server 2008 Express.
Os recursos usados serão:
Ambos são gratuitos e podem ser baixados no site da Microsoft.
Definindo o banco de dados e a tabela
O banco de dados usado neste projeto foi criado no projeto : VB .NET - Armazenando documentos em um banco de dados
Ele usa o Microsoft SQL Server 2012 Express LocalDB chamado Gedoc.mdf.
Vamos criar uma tabela chamada DocumentosPDF contendo a seguinte estrutura neste banco de dados:
Para visualizar o clique no menu VIEW clique em Other Windows -> DataBase Explorer para abrir a DataBase Explorer exibindo as conexões existentes com as fontes de dados:
O Microsoft SQL
Server 2012 Express LocalDB é um modo de
execução do SQL Server Express destinado a
desenvolvedores de programas. A instalação do LocalDB copia um conjunto mínimo de arquivos necessários para iniciar o mecanismo de Banco de Dados do SQL Server. Quando o LocalDB é instalado, os desenvolvedores iniciam uma conexão usando uma cadeia de conexão especial. Na conexão, a infraestrutura necessária do SQL Server é criada e iniciada automaticamente, permitindo que o aplicativo use o banco de dados sem tarefas de configuração complexas ou demoradas. O Developer Tools pode fornecer aos desenvolvedores um mecanismo de Banco de Dados do SQL Server que permite que eles gravem e testem o código Transact-SQL sem precisar gerenciar uma instância de servidor inteira do SQL Server. Uma instância do SQL Server Express LocalDB é gerenciada com o utilitário SqlLocalDB.exe. O SQL Server Express LocalDB deve ser usado em lugar do recurso de instância de usuário do SQL Server Express, que ficou obsoleto. |
Expanda os objetos da conexão e clique com o botão direito do mouse sobre Tables;
No menu suspenso clique em Add New Table;
Na janela do descritor SQL defina a estrutura da tabela com os seguintes campos:
Se você clicar sobre a conexão com o banco de dados Gedoc poderá ver na janela de propriedades a string de conexão definida:
Criando o projeto no Visual Basic 2010
Abra o Visual Basic 2010 Express e no menu File clique em New Project e selecione a linguagem Visual Basic e o template Windows Forms Application informando o nome SalvandoRecuperandoPDF;
Será criada uma solução contendo o projeto Windows Forms com um formulário form1.vb e arquivo de configuração App.Config.
Vamos incluir no formulário form1.vb os seguintes controles:
Conforme o leiaute abaixo:
Salvando documentos PDF
Neste formulário defina as declarações dos namespaces que iremos usar :
Imports
System.Data.SqlClient
Imports System.IO
Imports System.Security
imports System.Diagnostics
No botão btnlocalizar vamos incluir o código que permite ao usuário selecionar um documento para ser salvo no banco de dados.
Para isso vamos abrir uma janela Open File Dialog a partir da qual o usuário irá selecionar o arquivo:
Private Sub btnLocalizar_Click(sender As Object, e As EventArgs) Handles btnLocalizar.Click 'define as propriedades do controle 'OpenFileDialog Me.ofd1.Multiselect = False Me.ofd1.Title = "Selecionar Documento" ofd1.InitialDirectory = "C:\dados\" 'aplica um filtro ofd1.Filter = "Arquivos (*.PDF;*.AVI;*.MP3;*.BMP;*.JPG;*.GIF,*.PNG,*.TIFF)|*.PDF;*.AVI;*.MP3;*.BMP;*.JPG;*.GIF;*.PNG;*.TIFF|" & "Todos (*.*)|*.*" ofd1.CheckFileExists = True ofd1.CheckPathExists = True ofd1.FilterIndex = 2 ofd1.RestoreDirectory = True Dim dr As DialogResult = Me.ofd1.ShowDialog() If dr = System.Windows.Forms.DialogResult.OK Then If String.IsNullOrEmpty(ofd1.FileName) Then Return End If Try txtArquivoPDF.Text += ofd1.FileName 'define os dados do documento btnSalvar.Enabled = True Catch ex As SecurityException ' O usuário não possui permissão para ler arquivos MessageBox.Show((("Erro de segurança Contate o administrador de segurança da rede." & vbLf & vbLf & "Mensagem : ") + ex.Message & vbLf & vbLf & "Detalhes (enviar ao suporte):" & vbLf & vbLf) + ex.StackTrace) Catch ex As Exception ' Não pode carregar a imagem (problemas de permissão) MessageBox.Show(("Não é possível acessar o arquivo : " & ofd1.FileName & ". Você pode não ter permissão para ler o arquivo , ou " _ & " ele pode estar corrompido." & vbLf & vbLf & "Erro reportado : ") + ex.Message) End Try End If End Sub |
Após selecionar o arquivo e obter os dados documento o usuário deverá clicar no botão Salvar para armazenar o documento no banco de dados. O código deste botão é visto abaixo:
Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click Using conn As New SqlConnection("Data Source=(localdb)\v11.0;Initial Catalog=Gedoc;Integrated Security=True") conn.Open() Using cmd As New SqlCommand("Insert Into DocumentosPDF (arquivoPDF) Values (@PDF)", conn) cmd.Parameters.Add(New SqlParameter("@PDF", SqlDbType.VarBinary)).Value = File.ReadAllBytes(txtArquivoPDF.Text) cmd.ExecuteNonQuery() End Using End Using End Sub |
Recuperando documentos PDF
No evento Click do botão de comando Recuperar Arquivo PDF do formulário temos o código que acessa a tabela DocumentosPDF e exibe o documento PDF:
Private Sub btnRecupera_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRecupera.Click Dim caminhoArquivoPDF As String Dim buffer As Byte() 'If txtArquivoPDF.Text = String.Empty Then ' Return 'End If Using conn As New SqlConnection("Data Source=(localdb)\v11.0;Initial Catalog=Gedoc;Integrated Security=True") 'Dim sql As String = "Select arquivoPDF From DocumentosPDF where arquivoPDF = '" & txtArquivoPDF.Text & "'" conn.Open() Using cmd As New SqlCommand("Select Top 1 arquivoPDF From DocumentosPDF", conn) buffer = cmd.ExecuteScalar() End Using End Using caminhoArquivoPDF = System.IO.Path.GetTempFileName() File.Move(caminhoArquivoPDF, Path.ChangeExtension(caminhoArquivoPDF, ".pdf")) caminhoArquivoPDF = System.IO.Path.ChangeExtension(caminhoArquivoPDF, ".pdf") File.WriteAllBytes(caminhoArquivoPDF, buffer) Dim act As Action(Of String) = New Action(Of String)(AddressOf AbrirArquivoPDF) act.BeginInvoke(caminhoArquivoPDF, Nothing, Nothing) End Sub |
O código acima recupera sempre o primeiro documento da tabela, se desejar selecionar um documento informando pelo usuário monte uma cláusula SQL (eu deixei um exemplo comentado) usando um critério pelo nome do arquivo.
A rotina AbrirArquivoPDF que é chamada no código acima tem o seguinte código:
Private Shared Sub AbrirArquivoPDF(ByVal CaminhoArquivoPDF) Using p As New Diagnostics.Process p.StartInfo = New ProcessStartInfo(CaminhoArquivoPDF) p.Start() p.WaitForExit() Try File.Delete(CaminhoArquivoPDF) Catch End Try End Using End Sub |
Executando o projeto vemos na figura abaixo a recuperação e exibição de um arquivo :
O objetivo básico do artigo foi cumprido : mostrei como podemos armazenar e recuperar documentos PDF em um banco de dados.
A forma de implementação usada não esta aderente às boas práticas e precisa ser melhorada.
Temos que separar responsabilidades, evitar código duplicado, facilitar a manutenção, etc.
Pegue o projeto completo aqui: SalvandoRecuperandoPDF.zip
1Pe 3:12
Porque os olhos do Senhor estão sobre os justos, e os seus ouvidos atento à sua súplica; mas o rosto do Senhor é contra os que fazem o mal.1Pe 3:13
Ora, quem é o que vos fará mal, se fordes zelosos do bem?1Pe 3:14
Mas também, se padecerdes por amor da justiça, bem-aventurados sereis; e não temais as suas ameaças, nem vos turbeis;1Pe 3:15
antes santificai em vossos corações a Cristo como Senhor; e estai sempre preparados para responder com mansidão e temor a todo aquele que vos pedir a razão da esperança que há em vós;1Pe 3:16
tendo uma boa consciência, para que, naquilo em que falam mal de vós, fiquem confundidos os que vituperam o vosso bom procedimento em Cristo.Referências: