É 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:
(
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.
Artigo muito interessante.
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?
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’
Bom Dia!
Não consegui utilizar a query acima, alguém pode me ajudar ?
Precisei apenas exporta do banco através de um script rápido, mas aprendi mais ainda olhando esse vídeo, solucionou meu problema num piscar de olhos:
https://www.youtube.com/watch?v=ujMi5c9anls