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:

  1. Armazenar os dados binários como um arquivo no disco local;
  2. Armazenar os dados binários diretamente no banco de dados SQL Server;

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