Manipular dados em campos BLOB no Firebird com C#

 

Quem já precisou recuperar uma informação em um campo Blob do Firebird e o resultado através do DataSet foi somente “System.Array”.

 

Bom, recuperar informações em campos Blob do Firebird não é tão simples, requer um pouco de trabalho para ter a informação “traduzida”, e neste artigo pretendo passar o que fazer para recuperar esta informação.

 

Para isto, foi necessário criar um método que receba um Array de bytes ou a consulta a ser executada, neste exemplo optei por receber o comando SQL a ser executado, como pode ser visto a assinatura no método abaixo.

 

Exemplo:

  

public string ConsultaBlobFirebird(string consulta);

 

Sendo assim, o método deverá realizar a consulta no Banco de Dados, retornando a coluna Blob, e em seguida realizar o tratamento, este passo pode ser visto abaixo:

 

FbCommand comando = new FbCommand();

comando = conex.CreateCommand();

comando.CommandText = consulta;

FbDataReader reader = comando.ExecuteReader();

 

No código é declarado uma variável do tipo FbCommand chamada comando, que será responsável por receber nossa instrução SQL e retornar um DataReader com os dados. Outra variável que se encontra neste código é a reader do tipo FbDataReader, esta variável nos auxiliará na transformação dos dados que se encontram em Array de bytes para string. A variável conex é uma variável do tipo FbConection, sendo que antes de chamar este método ela já foi instanciada e a conexão se encontra aberta.

 

Após já termos os dados recuperados, através do método ExecuteReader() da variável comando, iniciaremos o tratamento dos dados. Abaixo, segue mais declarações a serem feitas para a continuação da construção deste método:

 

      string texto = "";

      Byte[] blob = null;

      MemoryStream ms = new MemoryStream();

 

A variável texto será usada somente para atribuir os dados transformados para string, a variável blob cujo o tipo é um Array  de Bytes, receberá o Array que se encontra gravado no Banco de Dados, e a variável ms será responsável por armazenar nosso Array blob.

 

O código abaixo é responsável por recuperar as colunas que estavam em nossa instrução SQL, ler o Array resultante da pesquisa da posição 0 até o tamanho total do mesmo e atualizar nosso Memory Stream ms com este valor. Caso alguma exceção aconteça, será retornado de nossa função uma string vazia, caso contrária será executado o seguinte passo.

 

      while (reader.Read())

      {

        blob = new Byte[(reader.GetBytes(0, 0, null, 0,

                         int.MaxValue))];

            try {

                  reader.GetBytes(0, 0, blob, 0, blob.Length);

            } catch {

                  texto = "";

                  return texto;

            }

            ms = new MemoryStream(blob);

     }

 

Após executado a consulta, recuperado o array de bytes, ter lido e armazenado o mesmo em uma variável do tipo MemoryStream, chegou a hora de transformar estes bytes em texto. Para isto o seguinte código foi necessário.

 

       StreamReader ler = new StreamReader(ms);

      while (ler.Peek() != -1)

            {

                texto = texto + "\r\n" + ler.ReadLine();

      }

      return texto;

 

Como nosso ms já está atualizado com o valor que veio do Banco de Dados, criamos então uma variável do tipo StreamReader, para que possa ler os dados contidos em um Stream, que em nosso caso é a nossa variável ms.

 

Após instanciarmos a variável ler do tipo StreamReader, possamos fazer um loop na mesma, executando o comando ReadLine(), que irá ler todas as linhas em string que estiverem contidas nesta variável.

 

Sendo assim, iremos concatenar com a nossa variável texto, utilizando o \r\n para quebrar uma linha e realizar a tabulação.

        

Bom pessoal, é isso, para retornar um dado de um campo Blob do Banco de Dados Firebird. Esta é apenas uma idéia, que com certeza pode ser melhorada ou modificada para atender as necessidades de cada um. Espero ter sido claro nas explicações e até o próximo artigo.