quarta-feira, 16 de dezembro de 2009

Importar e Exportar imagem do banco.

Hoje há muita controversia a respeito de colocar imagens direto no banco de dados ou colocar apenas o caminho para uma pasta fisica.

Independente da discussão, aqui vai um exemplo de como colocar uma imagem no banco e depois recuperá-la.

Primeiro passo: Criar a tabela.

If Exists(Select 0 from Sys.Objects Where name = 'tbCachimbos')
Begin
Drop Table dbo.tbCachimbos
End
GO
Create Table dbo.tbCachimbos(
idCachimbo int Identity(1,1) NOT NULL,
dsCachimbo VarChar(1000) Not Null,
dsimage Image NULL,
Constraint PK_Cachimbos Primary Key Clustered (idCachimbo ASC))


* Notem o campo dsimage do tipo Image.


Segundo passo: Fazer o insert de um registro e depois colocar a imagem.

Insert Into dbo.tbCachimbos (dsCachimbo) Values ('Brebbia First Rocciata Double Silver Band')

Update dbo.tbCachimbos
Set dsimage = (Select * From OpenRowset (Bulk 'd:\Projetos\Brebbia.jpg', Single_Blob) as a )
Where idCachimbo = @@Identity


* Faça um select da tabela tbCachimbos e veja como está o campo dsimage.


Terceiro passo: Recuperar a imagem.

Para recuperar a imagem, é preciso utilizar o BCP para gravar um arquivo. O problema de gravar um arquivo imagem a partir do campo de uma tabela é conseguir recuperar a tipagem correta da coluna e gravar em um arquivo sem nenhuma alteração de conteudo.

Entre alguns exemplos que consegui, acabei optando por usar um arquivo FMT como padrão de saida.

O arquivo FMT fica assim:

9.0
1
1 SQLIMAGE 0 0 "" 1 dsimage ""


E para recuperar a imagem:

Declare @SQLcommand NVarChar(4000)

Set @SQLcommand = 'bcp "SELECT dsimage FROM BancoTeste.dbo.tbCachimbos" queryout "d:\Projetos\Brebbia_Recuperado.jpg" -T -fd:\Projetos\Imagens.fmt'

Exec xp_cmdshell @SQLcommand, no_output


Um comentário:

  1. achei interessante o post, estou pesquisando justamente isso, porém não consegui exportar o arquivo de imagem para a unidade. o que é extensão fmt? Isso funciona com a versão sql 2008?

    Para mim ocorre o seguinte erro:
    SQLState = S1000, NativeError = 0
    Error = [Microsoft][SQL Server Native Client 10.0]Não é possível abrir o arquivo de dados do host BCP
    NULL

    ResponderExcluir