Armazenando arquivos em modo binário no Banco SQL Server.

É possível armazenar arquivos no banco de dados de duas maneiras:

  • Referência: O arquivo é salvo em um diretório ou compartilhamento via rede através de sua referência. Exemplo: O arquivo MSDN.PNG está no diretório Z:\Imagens\, logo a referência armazenada no campo será Z:\Imagens\MSDN.PNG.
  • Arquivo: O arquivo é salvo diretamente na tabela do banco de dados.

Neste artigo, demonstraremos como salvar um arquivo diretamente no banco de dados SQL Server, utilizando um campo na tabela do tipo varbinary(max). Este campo suporta dados binários de comprimento variável, com tamanho máximo aproximado de 2GB.

No SQL Server, objetos binários grandes (BLOB – Binary Large Object) podem ser do tipo dados varbinary(max) padrão, que armazenam os dados em tabelas, ou do tipo objetos varbinary(max) FILESTREAM, que armazenam os dados no sistema de arquivos. No exemplo abaixo, utilizaremos o tipo varbinary(max) padrão.

1. Criando a tabela para armazenamento dos arquivos
Para criar a tabela no SQL Server Management Studio, foi utilizada a seguinte sintaxe:

CREATE TABLE Arquivos
(
    Id int,
    Nome varchar(50) not null,
    Arquivo varbinary(max) not null
)


2. Inserindo dados na tabela

Após a criação da tabela, utilize o comando OpenRowSet em conjunto com a opção Bulk para inserir o arquivo desejado:

INSERT INTO Arquivos (Id, Nome, Arquivo) 
Select 1, 'file1.pdf', BulkColumn 
FROM Openrowset( Bulk 'C:\Relatorio1.pdf', Single_Blob) as Arquivo 

3. Integrando leitura e gravação dos arquivos a partir do Elipse E3
Antes de tudo, é necessário criar um objeto Banco de Dados no Elipse E3, para só então realizar as operações de escrita e leitura via E3Query e scripts.

Para inserir o arquivo no banco de dados, foi utilizada a seguinte cláusula SQL em uma consulta:

Para enviar o arquivo, será necessário executar a consulta que contém as variáveis a serem substituídas.

O seguinte script pode ser utilizado:

If Application.ShowFilePicker(true, File,, 128, "Todos os arquivos|*.*") Then
   VarPath = File
   VarFileName = InputBox("File Name (Ex: file1.pdf, file1.doc, picture.png...)") 
Set Consulta = Screen.Item("Insert")
Consulta.SetVariableValue "FileName", VarFileName
Consulta.SetVariableValue "Path", VarPath
Screen.Item("Insert").Execute(true)
End If

Para ler os dados binários do sistema de arquivos que estão salvos no banco, utilizaremos o componente ADODB.Stream, que tem a capacidade de ler estes dados para posterior armazenamento em disco local. O seguinte script e consulta SQL foram utilizados:

 

Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
arquivo = InputBox("File Name:")
'Consulta que busca o valor binário do banco
Screen.Item("Consulta1").SetVariableValue "NomeVar", arquivo
set rs = Screen.Item("Consulta1").GetADORecordset()
bin = rs.Fields.Item("Arquivo").Value

 

Set outputStream = CreateObject("ADODB.Stream")
outputStream.Type = 1 ' adTypeBinary
outputStream.Open
outputStream.Write bin
outputStream.SaveToFile "C:\" & arquivo, adSaveCreateOverWrite

Para maiores informações, consulte a aplicação demo em anexo, desenvolvida na versão 4.7 build 300 do Elipse E3 em conjunto com o SQL Server 2008 R2.

NOTA: Para que o exemplo desenvolvido funcione corretamente, é preciso que o Banco de Dados SQL Server esteja instalado no computador local (ou em outro da mesma rede que permita acesso). Então, configure o objeto Banco de Dados (BancoDados1) existente na aplicação, e crie a tabela que armazenará os arquivos.

Anexos:

5381.zip

Print Friendly, PDF & Email

Este artigo foi útil? Was this helpful?

Classificação média - Average rating 5 / 5. Count: 1

Thoughts on “Armazenando arquivos em modo binário no Banco SQL Server.

  1. Excelente artigo Delio, parabéns. Estou buscando exatamente o contrário, como conseguiria fazer o contrario. Existe alguma query que possa executar isso, sem ser por uma aplicação?

    1. Olá Jackson,
      Para exportar um arquivo binário, via SQL Management você pode utilizar o utilitário BCP (bulk copy program), que copia dados em massa entre uma instância do Microsoft SQL Server e um arquivo de dados em um formato especificado pelo usuário.

      Ativar xp_cmdshell:
      Xp_cmdshell é o comando TSQL para executar o comando do shell do SO, por padrão ele está ativado.

      — To allow advanced options to be changed.
      EXEC sp_configure ‘show advanced options’, 1;
      GO
      — To update the currently configured value for advanced options.
      RECONFIGURE;
      GO
      — To enable the feature.
      EXEC sp_configure ‘xp_cmdshell’, 1;
      GO
      — To update the currently configured value for this feature.
      RECONFIGURE;
      GO

      Carregando o arquivo binário na tabela:

      INSERT INTO Arquivos (Id, Nome, Arquivo)
      Select 1, ‘image2.PNG’, BulkColumn
      FROM Openrowset( Bulk ‘C:\Image.png’, Single_Blob) as Arquivo

      Para recuperar a imagem, é preciso utilizar o utilitário BCP para gravar um arquivo. O problema de gravar um arquivo a partir do campo de uma tabela é conseguir recuperar a tipagem correta da coluna, e gravar em um arquivo sem nenhuma alteração de conteúdo.
      Portanto acabei optando por usar um arquivo FMT como padrão de saída.

      Arquivo de formato (testblob.fmt):
      14.0
      1
      1 SQLBINARY 0 0 “” 1 Arquivo “”

      Recuperando o arquivo binário:
      EXEC master.dbo.xp_CmdShell ‘BCP “select Arquivo from Arquivos where Nome = ”image2.PNG” ” QUERYOUT “C:\blob\image2.PNG” -T -f “C:\blob\testblob.fmt” -SDELIO\SQLEXPRESS’

Leave a Reply

Your email address will not be published.Required fields are marked *