ASP.NET - Trabalhando com BLOBs no SQL Server - I
Muitas vezes precisamos armazenar uma grande quantidade de dados no SQL Server como documentos, documentos XML e imagens.
Para estes casos específicos o SQL Server fornece um tipo de dados especial apropriados para um grande volume de dados e neste artigo eu vou mostrar como podemos ler e gravar BLOBs - Binary Large Objects usando o SQL Server e ADO .NET.
Nota: BLOB é um acrônimo para binary large object , uma coleção de dados binários armazenados em um identidade única no SQL Server.
Estes tipos de dados, Large Objects , podem ser classificados em CLOBs - Character Large Objects ou BLOBs - Binary Large Objects e o SQL Server possui um tipo diferente de dados para cada um destes objetos. Vejamos na tabela abaixo os tipos de dados que podemos usar neste caso:
LOB Type | Tipo de dadaos SQL Server | Tamanho Máximo |
BLOB | varbinary(MAX)
Image(*) |
2.147.483.647 |
CLOB | varchar(MAX) Text(*) |
2.147.483.647 |
CLOB - Unicode | nvarchar(MAX) NText(*) |
1.073.741.823 |
dados XML | xml | 2.147.483.647 |
Os tipos de dados (*) Text, NText e Image já existiam em versões anteriores do SQL Server. É recomendado que você use os novos tipos de dados : varchar(MAX), nvarchar(MAX) e varbinary(MAX)
Observando a tabela vemos que o tipo de dados varbinary(MAX) é o que permite tratar com imagens ou Large Binary Data. Neste artigo vamos nos ater a utilização deste tipo de dados.
Nota: Os tipos de dados binários permitem que você armazene qualquer tipo de dados binários incluindo arquivo inteiros até 2 GB.(varbinary(max) e image)
Armazenando BLOBs no SQL Server
Dados binários podem se apresentar em uma variedade de formas como : documentos do word, arquivos PDF, Fotos , imagens , etc.
Quando formos armazenar um destes tipos de dados podemos seguir dois caminhos:
Ambas soluções possuem seus prós e seus contras. Vejamos cada uma delas em detalhes:
1 - Armazenar os dados binários como um arquivo no disco local é uma boa opção se :
O grande problema com esta solução que os dados estarão fora do banco de dados e podem perder a sincronia com os demais dados em operações de exclusão, atualização, inclusão e transferência de dados. Outro fator a considerar é que o backup deverá ser feito separado.
2 - Armazenar os dados binários diretamente no banco de dados SQL Server possui as seguinte vantagens:
Usando BLOBs e ADO .NET
Os dados binários do tipo BLOB são representados por um array de bytes na plataforma .NET. Para ler dados BLOB você pode usar a classe SqlDataReader da ADO .NET cujo exemplo veremos a seguir.
Nota: Tratar com dados BLOB requer trabalhar a nível de byte. O objeto SqlDataReader contém o método GetBytes para acessar os dados de uma coluna como bytes. Uma vez que os bytes sejam lidos eles podem ser combinados com o objeto FileStream para salvar o objeto BLOB para um arquivo. |
Vamos criar um pequena aplicação que gerencia fotos armazenadas no banco de dados SQL Server. Para trabalhar vamos usar o SQL Server 2005 Express Edition e criar um banco de dados chamado Dados e uma tabela chamada Fotos contendo a seguinte estrutura:
Nome da Coluna | Tipo de dados (Data Type) | Descrição |
fotoID | int (Identity, Primary Key) | Código da foto - identifica a foto de forma única |
titulo | varchar(255) | Título da foto |
descricao | varchar(MAX) | descrição da foto |
foto | varbinary(MAX) | foto na forma binária. |
Iremos criar uma aplicação web usando o Visual Web Developer 2008 Express Edition que permite ao usuário incluir, modificar e deletar registros individuais de uma tabela Fotos.
Abra o VWD 2008 e crie um novo web site com o nome AlbumFotos através do menu através do menu File -> New Web Site , selecionando a linguagem Visual Basic;
Serão criados o arquivo Default.aspx, o arquivo web.config e a pasta App_Code;
Que tal definir o banco de dados na pasta App_Code no próprio ambiente do VWD 2008 ?
Clique então sobre a pasta App_code com o botão direito do mouse e selecione a opção Add New Item;
A seguir selecione o template SQL Server DataBase e informe o nome Album.mdf;
Os objetos do banco de dados serão exibidos na janela DataBase Explorer. Clique sobre o objeto Table com o botão direito do mouse e selecione New Table;
Defina a estrutura da tabela Fotos conforme a figura abaixo definindo o campo fotoID como chave primária e do tipo identity;
Salve a tabela com o nome Fotos;
Agora que já temos a tabela vamos criar a classe Foto que irá representar os objetos Fotos, vamos nos basear nos campos definidos no banco de dados e criar a classe com 4 propriedades a saber: FotoID, Titulo, Decricao e FotoDados;
Na janela Solution Explorer clique com o botão direito do mouse sobre o nome do web site e selecione Add New Item;
A seguir selecione o template Class e informe o nome Foto.vb; (O arquivo será criado na pasta App_Code);
Agora já podemos definir as propriedades da classe Foto conforme o código a seguir:
Public Class Foto Private _fotoID As Integer Public Property FotoID() As Integer Get Return _fotoID End Get Set(ByVal value As Integer) _fotoID = value End Set End Property Private _titulo As String Public Property Titulo() As String Get Return _titulo End Get Set(ByVal value As String) _titulo = value End Set End Property Private _descricao As String Public Property Descricao() As String Get Return _descricao End Get Set(ByVal value As String) _descricao = value End Set End Property Private _fotoDados As Byte() Public Property FotoDados() As Byte() Get Return _fotoDados End Get Set(ByVal value As Byte()) _fotoDados = value End Set End Property End Class |
Com isso já temos a tabela pronta para usar no nosso projeto e a classe Foto que representa os objetos Fotos.
No próximo artigo irei criar a classe que fará o acesso a dados e os métodos usados para manutenção das informações.
Acompanhe a continuação no artigo : ASP.NET - Trabalhando com BLOBs no SQL Server II
Eu sei é apenas ASP .NET, mas eu gosto...
José Carlos Macoratti