Atenção: esse artigo tem uma palestra complementar. Clique e assista!
Atenção: esse artigo tem dois vídeos complementares.
Clique e assista o primeiro!
Clique e assista o segundo!
Uma quantidade muito grande de arquivos é gerada diariamente no trabalho com os programas de computadores. Boa parte destes devem ser armazenados e disponibilizados para fácil acesso por vários usuários. O artigo demonstra como usar um banco de dados para centralizar o armazenamento destes arquivos não só para usar como cópia de segurança, mas também para facilitar seu acesso na rede.
Para que serve
As técnicas usadas para enviar arquivos digitais para os bancos de dados podem ser usadas para se criar programas para armazenamento e recuperação de documentos. Imagens, certificados, documentos do Office e PDF podem ser armazenados, fora outros tipos de arquivos.
Em que situação o tema é útil
Quando estiver precisando organizar o grande número de arquivos que são gerados em um ambiente coorporativo ou simplesmente aqueles arquivos de fotos que ficam espalhados pelo HD, o uso de um banco de dados pode facilitar tanto para fazer cópia de segurança e garantir que estes dados não serão perdidos como, ao se usar palavras-chave, facilita a localização dos arquivos posteriormente.
Resumo do DevMan
Atualmente é possível gravar uma grande variedade de documentos digitalmente. Os arquivos de imagens, documentos de texto, planilhas eletrônicas, arquivos de áudio e tudo o mais acabam se espalhando de uma forma tão caótica no disco rígido que chega um momento em que é preciso organizar isto para facilitar sua recuperação. O uso de um banco de dados como o SQL Server 2008 possibilita a centralização do armazenamento destes arquivos. Para que estes arquivos sejam armazenados no banco de maneira que seja fácil sua recuperação alguns passos precisam ser dados. O artigo cobre as tarefas envolvidas no processo de envio dos arquivos para o banco. Como complemento, mostra também como armazenar e recuperar dados de configurações de aplicações Windows Forms usando os arquivos de configuração nativos do .NET Framework. Além disto, o artigo vai demonstrar como separar a implementação das regras de negócio da aplicação da camada de apresentação (interface com o usuário).
Arquivos digitais contêm bytes apenas e, eventualmente, alguma informação sobre sua estrutura e de como estes bytes estão armazenados. Essa afirmação, óbvia, esconde alguns problemas. Por exemplo, quando gravamos arquivos em disco, é para sua posterior utilização, como localizar este arquivo de forma eficaz?
O Windows Vista começou a facilitar esta tarefa através da implementação da busca dos arquivos diretamente pelo menu “Iniciar” usando para isto um índice que armazena os nomes dos arquivos e sua localização.
Mas considere uma questão: como resolver o problema de armazenamento de arquivos digitais em um ambiente de rede? Por questões de segurança, nem sempre o compartilhamento de pastas na rede será possível (ou desejável) de se usar, então, como fazer para disponibilizar acesso a arquivos digitais pela rede sem precisar abrir compartilhamentos de rede?
E se for criado um diretório compartilhado no servidor (ou servidores), como fazer para administrar o seu crescimento para que, com o tempo, a quantidade de arquivos não fuja do controle? Uma proposta é: por que não usar um gerenciador de bancos de dados para disponibilizar acesso a arquivos?
Os gerenciadores de banco de dados, com índices, tabelas e mecanismos de busca e gerenciamento oferecem meios eficientes para consultar e recuperar dados destes arquivos. Em se tratando do banco de dados SQL Server 2008 da Microsoft, é disponibilizado um tipo de dados para as colunas das tabelas chamado “IMAGE” que nada mais é do que um repositório para um vetor com bytes de um arquivo. Mesmo que esteja discriminado como “IMAGE”, dada a sua natureza, arquivos de qualquer tipo podem ser guardados neste tipo de campo sendo recuperados posteriormente sem perda de dados.
Para enviar os arquivos para este tipo de campo a tarefa a ser feita é a serialização do arquivo, ou seja, transformação do seu conteúdo em um vetor de bytes.
A busca dos arquivos no disco sempre foi um ponto importante nos sistemas operacionais modernos. Outros sistemas operacionais como o “Apple Mac OS” já buscavam facilitar o acesso aos arquivos desde as primeiras versões. A própria Microsoft criou um projeto, abandonado atualmente, em que pretendia usar um sistema de arquivos baseado em um banco de dados SQL Server, projeto este chamado “Windows Future Storage” (WinFS).
Serialização de arquivos
O processo de serialização de arquivos percorre toda a extensão do arquivo retornando os bytes que o compõe. Este processo é perfeito para se enviar o arquivo para outros processos estando estes no mesmo computador ou distribuídos em rede (ou pela internet).
O .NET Framework possui uma ampla biblioteca com várias classes para manipulação de arquivos denominada System.IO. Um código típico para serializar os arquivos é demonstrado a seguir:
FileStream arq = new FileStream(@"d:\imagem.jpg", FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(arq);
byte[] ret = br.ReadBytes((int)arq.Length);
De maneira rápida e direta, tudo o que é necessário são uma instância da classe FileStream para abrir o arquivo do disco e outra da classe BinaryReader que como está demonstrado, faz a leitura retornando um array de bytes.
Além desta classe, System.IO também possui classes que permitem realizar outras operações como cópia, exclusão e recuperação de dados sobre o arquivo. Uma delas é FileInfo que será usada no projeto para obter dados como o tamanho do arquivo, sua extensão, e o nome completo, separadamente do caminho no disco.
Acessando bancos de dados
Dentro do .NET Framework o acesso ao banco de dados é feito com a plataforma (ou recursos) ADO.NET. Este pode ser entendido como um conjunto de classes que permitem acessar a diversos gerenciadores de bancos de dados, fazer consultas, executar stored procedures e, como é de se esperar, todas as operações CRUD (Create, Read, Update, Delete).
Existem drivers nativos para acesso aos bancos de dados mais básicos suportados pelo .NET Framework. Entre eles destacam-se:
1. System.Data.SqlClient: para uso com o SQL Server;
2. System.Data.OleDb: usado geralmente com o Microsoft Access;
3. System.Data.ODBC: usado para outros bancos de dados como o Firebird e tabelas avulsas de bancos como o Paradox e até mesmo dBase.
A classe principal, responsável pela conexão com o banco de dados é SqlConnection. Esta classe deve ser inicializada contendo um dado de configuração chamado de “string de conexão”, ou “connection string” do termo em inglês, que contém alguns dados como o exemplo seguinte:
...