Dica – Armazenando arquivos de imagem no SQL Server 2008 e R2 através do comando OpenRowset em conjunto com a opção Bulk.

Galera, boa tarde.

Olha nóis aqui outra vez, mas uma dica para vocês.

Na dica de hoje vou apresentar como podemos armazenar arquivos de imagem no formato .jpeg e .jpg no Microsoft SQL Server 2008 R2.

Um dos maiores questionamentos que conheço na área de Banco de Dados, esta relacionado ao armazenamento de imagens no Banco de Dados. Dentre estes, gostaria de destacar:

  • Quais o benefícios em se armazenar uma imagem no Banco de Dados?
  • Teria perda de performance em armazenar uma imagem no Banco?
  • Qual tipo de dados utilizar, Image ou Varbinary?
  • Minha aplicação vai conseguir acessar normalmente o conteúdo da imagem?

E por ai vai, são inúmeras as dúvidas, ressalvas, questionamentos e até mesmo falta de conhecimento. Responder neste momento todos estes questionamentos, com certeza vai requerer muito tempo, como também, uma série de levantamentos de acordo com o cenário, necessidade e regras de negócio.

Eu particularmente sou mais conservador e procuro sempre levar em consideração se realmente é necessário armazenar este tipo de informação em um banco de dados, ainda mais nas últimas versões do Microsoft SQL Server 2008 e R2 que podemos fazer uso do FileStream para acesso direto a arquivos em disco, como também, no Microsoft SQL Server 2012 através do Filetable em conjunto com o FileStream.

Mesmo assim, com toda esta gama de recursos e facilidades procuro sempre alertar meus clientes, alunos e amigos de alguns impactos que considero básicos ao armazenar uma imagem no banco de dados:

  • Aumento no tamanho do banco;
  • Sobrecarga de processamento nas transações;
  • Aumento do tamanho do arquivo de backup;
  • Aumento no tempo de execução e restauração do backup; entre outros.

Pois bem, deixando de lado, estas considerações, vou tentar demostrar de forma simples como podemos fazer a carga de dois arquivos com extensão .jpg armazenados fisicamente em disco para uma tabela no Microsoft SQL Server 2008 R2 utilizando o tipo de dados Varbinary. Vale ressaltar que este tipo de dados foi introduzido a partir do SQL Server 2005 SP2, desde então considerado o melhor tipo de dados para se trabalhar com valores binários ou dados que serão tratados como binários.

Vamos lá, o código de exemplo utilizado nesta dica é bastante simples, inicialmente realizamos a criação de uma tabela denominada Imagens, conforme apresenta o Código 1, apresentado a seguir:

— Código 1 – Criando a Tabela Imagens –

Create Table Imagens

(

Codigo Int Identity(1,1) Not Null Primary Key,

NomedoArquivo Varchar(1000) Not Null,

Arquivo Varbinary(Max)

)

 

Após a criação da tabela, podemos passar para o segundo passo, que consiste na Carga dos arquivos “Assinatura.jpg” e “Imagem.jpg”, ambos localizados na pasta C:\Temp da Minha máquina para o meu Banco de Dados.

Este é o passo mais importante, pois estaremos utilizando o comando OpenRowSet em conjunto com a opção Bulk, realizando os seguintes passos:

  1. Identificação, acesso e leitura do conteúdo do arquivo em disco;
  2. Interpretar este conteúdo que será enviado para o SQL Server; e
  3. Realizar a conversão dos arquivos para o formato Varbinary.

Em todos estes passos, o comando OpenRowSet, não realiza qualquer tipo de sobrecarga de processamento por parte do SQL Server, ele trabalha de forma independente, utilizando so capacidade de acesso direto a dados, para somente ao final deste processo começar a fazer o envido destes dados para o SQL Server.

Observação: Através do comando OpenRowSet, conseguimos fazer acesso direto a dados disponibilizados em servidores remotos. Este comando tem como facilidade fazer uso de métodos únicos de acesso através de comunicação ad-hoc.

Bom, vamos então apresentar o segundo passo, denominado Código 2:

— Código 2 – Carga dos arquivos para a tabela Imagens –

INSERT INTO Imagens(NomedoArquivo, Arquivo)

SELECT ‘Image.jpg’, *

FROM OPENROWSET(BULK N’C:\Temp\Image.jpg’, SINGLE_BLOB) Load;

 

INSERT INTO Imagens(NomedoArquivo, Arquivo)

SELECT ‘Assinatura.jpg’, *

FROM OPENROWSET(BULK N’C:\Temp\Assinatura.jpg’,  SINGLE_BLOB) Load;

Pronto agora que já conhecemos o Código 2, fica bem mais fácil entender a sua função e importância. Podemos notar que além do comando OpenRowSet e da opção Bulk, devemos também especificar que tipo de formato de arquivos estamos fazendo a carga para dentro do SQL Server. Isso é facilmente definido em nosso código através da opção Single_BLOB, onde estaremos informando para o SQL Server, que o trata-se de um simples objeto binário de grande tamanho.

Após isso, nossos dados já estão gravados no SQL Server, o que nos resta é fazer um simples Select consultando os dados nesta tabela que serão apresentados na Coluna Arquivo de forma Binária. Para que você possa apresentar estas imagens de uma forma legível, utilize qualquer aplicação ou gerador de relatórios fazendo uso de componentes do tipo Image, responsáveis em decodificar e converter o conteúdo binário em pontos mapeados conhecidos como bitmap.

Bem, mais uma vez quero agradecer a sua visita, vou encerrando mais esta dica por aqui.

Nos vemos por ai, em breve.

Valeu.

Anúncios

Sobre Junior Galvão - MVP

Profissional com vasta experiência na área de Tecnologia da Informação e soluções Microsoft. Graduado no Curso Superior em Gestão da Tecnologia de Sistemas de Informação. Pós-Graduado no Curso de Gestão e Engenharia de Processos para Desenvolvimento de Software com RUP na Faculdade FIAP - Faculdade de Informática e Administração Paulista de São Paulo. Pós-Graduado em Gestão da Tecnologia da Informação Faculdade - ESAMC Sorocaba. Formação MCDBA Microsoft, autor de artigos acadêmicos e profissionais postados em Revistas, Instituições de Ensino e WebSistes. Meu primeiro contato com tecnologia ocorreu em 1995 após meus pais comprarem nosso primeiro computador, ano em que as portas para este fantástico mundo se abriram. Neste mesmo ano, comecei o de Processamento de Dados, naquele momento a palavra TI não existia, na verdade a Tecnologia da Informação era conhecida como Computação ou Informática, foi assim que tudo começou e desde então não parei mais, continuando nesta longa estrada até hoje. Desde 2001 tenho atuado como Database Administrator - Administrador de Banco de Dados - SQL Server em tarefas de Administração, Gerenciamento, Migração de Servidores e Bancos de Dados, Estratégias de Backup/Restauração, Replicação, LogShipping, Implantação de ERPs que utilizam bancos SQL Server, Desenvolvimento de Funções, Stored Procedure, Triggers. Experiência na Coordenação de Projetos de Alta Disponibilidade de Dados, utilizando Database Mirroring, Replicação Transacional e Merge, Log Shipping. Atualmente trabalho como Administrador de Banco de Dados no FIT - Instituto de Tecnologia da Flextronics, como também, Consultor em Projetos de Tunnig e Performance para clientes, bem como, Professor Titular na Fatec São Roque. Desde 2008 exerço a função de Professor Universitário, para as disciplinas de Banco de Dados, Administração, Modelagem de Banco de Dados, Programação em Banco de Dados, Sistemas Operacionais, Análise e Projetos de Sistemas, entre outras. Possuo titulações e Reconhecimentos: Microsoft MVP, MCC, MSTC e MIE.
Esse post foi publicado em Dicas, Mundo SQL Server, Scripts, SQL Server, VIRTUAL PASS BR, Windows e marcado , , , , , , , . Guardar link permanente.

19 respostas para Dica – Armazenando arquivos de imagem no SQL Server 2008 e R2 através do comando OpenRowset em conjunto com a opção Bulk.

  1. Meu amigo, muito bom seu artigo. Estou precisando armazenar em um banco de dados um arquivo XML. Posso utilizar o tipo de dados Varbinary? se eu precisar recuperar o arquivo do banco e gera-lo fisicamente novamente em uma pasta, qual seria o comando do SQL Server?? Abraços.

    Curtir

    • Alexandre, bom dia.

      Quero agradecer a sua visita ao meu blog. Espero poder ajudar.

      Vamos com partes:

      1 – Você deseja utilizar um arquivo XML e converter para Varbinary?

      A resposta é sim, isso é possível de ser feito, você vai necessitar utilizar conversão explícita.

      2 – Para gerar o arquivo em disco com os dados do seu banco, você poderá fazer isso através da ferramenta BIDS ou também utilizando o comando SQLCMD ou BCP. Sendo todos ferramentas externas do SQL Server.

      Basicamente essas seriam as possibilidade iniciais.

      Até mais.

      Curtir

  2. Excelente post, realmente deu certo aqui, uma outra perfunta, a possibilidade de eu importar um arquivo .PDF? e como faco para ler esse arquivo? Obrigado

    Curtir

  3. walvesdg disse:

    Poxa aqui não tá rolando :´(
    tá dando o seguinte erro:
    Cannot bulk load because the file “C:\Users…” could not be opened. Operating system error code 5(Acesso negado.).

    Code Snipet:

    INSERT INTO imagem (nomeImg,imgBinar)
    SELECT ‘foto.jpg’,
    * FROM OPENROWSET (BULK ‘C:\Users\…’,SINGLE_BLOB)LOAD;

    O que que tô fazendo de errado????

    Valeu e Parabéns pelo Blog, explanações claras e bastante detalhadas sem perder a objetividade!!!!

    Curtir

  4. CodexZombie disse:

    Então Junior, o problema é justamente esse!!! Por que não tenho permissão? estou fazendo isso no meu PC, meu perfil é ADMIN, to logando no banco com usuário sa, já tentei colocar o arquivo na area de trabalho compartilhada e nada…

    Curtir

    • Codex,

      De qual permissão você se referi? O usuário SA é System Administrator do SQL Server, ele não tem nenhuma relação com a parte de File Server do Windows, um teste que você poderia fazer é adicionar o seu usuário administrador na permissões da pasta ou em último caso o usuário Everyone.

      Até mais.

      Curtido por 1 pessoa

  5. Olá Junior, parabéns pelo material, gostei bastante. Mas gostaria de uma informação adicional: preciso armazenar diversos tipos de documentos (jpg, xls, pdf, doc, etc…) e tenho utilizado apenas uma indexação no banco SQL. Existe alguma forma de salvar esses arquivos também no SQL como sugere com as imagens jpg ?
    Obrigado,
    Abraços,
    Eduardo

    Curtir

    • Eduardo, boa noite.

      Obrigado por sua visita e comentário.

      Em relação a sua dúvida você pode sim fazer o armazenamento deste tipo de arquivo utilizando o tipo de dados varbinary. A partir da versão 2012 a Microsoft adicionou o recurso chamado filetable que permite justamente armazenar de forma direta um arquivo em file system e ser acessado todas as informações e estrutura do arquivo diretamente no SQL Server.

      Acredito que este pode ser o seu caminho.

      Até mais.

      Curtir

  6. Albert da silva disse:

    Lá no select vc usa o * não é isso .
    Será que no lugar do asterisco eu não poderia colocar o nome da coluna por que o meu tá dando erro de subconsuta.

    Curtir

  7. Albert da silva disse:

    Vc sabe importa tabelas do Excel do formato xlsx para o sql Server será se tem Como?

    Curtir

  8. Albert,

    Você poderia compartilhar a maneira que conseguiu importar as fotos.

    Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s