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.