Apesar de ser confundido com o tamanho do campo, na verdade o segmento (identificado como length) é o tamanho dos blocos em que a informação é gravada no banco de dados e posteriormente, o tamanho do buffer de leitura de um campo blob. Por padrão, quando se cria um campo blob o segmento vem como 80bytes, isso pelo fato dos monitores antigos apresentarem 80bytes por vez.
De acordo com os manuais do Firebird, o tamanho máximo de um arquivo blob é definido de acordo com o Page Size do banco de dados, seguindo esta regra:
| Page Size | Tamanho máximo do blob |
|---|---|
| 1Kb | 64Mb |
| 2Kb | 512Mb |
| 4Kb | 4Gb |
| 8Kb | 32Gb |
| 16Kb | 256Gb |
procedure LendoConteudoBlobADO(CaminhoParaSalvar : String); var Stm : TStream; fl : TFileStream; begin Stm := TStream.Create; fl := TFileStream.Create(CaminhoParaSalvar, fmCreate); ADOTable1.Open; ADOTable1.Edit; //ABRIR EM MODO DE EDIÇÃO OBRIGATORIAMENTE Stm := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('campo_blob'), bmReadWrite); fl.CopyFrom(stm,Stm.Size); ADOTable1.Cancel; Stm.Free; fl.Free; end;
procedure GravandoBinarioNoBanco(CaminhoDoArquivo : String); var Stm: TStream; fl : TFileStream; begin Stm := TStream.Create; fl := TFileStream.Create(CaminhoDoArquivo, fmOpenRead); ADOTable1.Open; ADOTable1.Append; Stm := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('campo_blob'), bmReadWrite); stm.CopyFrom(fl,fl.Size); Stm.Free; ADOTable1.Post; fl.Free; end;