Newsgroup: it.comp.lang.delphi
Titolo: ClientDataset + campo Blob (db Firebird) + stream

devo memorizzare il contenuto di un messaggio su un campoi blob
il messaggio sCorpo e' una TstringList , letta con Indy10
 
//lettura corpo messaggio , EdCorpo e' un TMemo
if MailMessage.MessageParts[j] is TIdText then
    EdCorpo.Lines.AddStrings((MailMessage.MessageParts[j] as TIdText).Body);
 
dato che non posso assegnare un campo 
ClientDataSet.FieldByName('CORPO').AsBlob  .. AsBlobField
 
ho cercato altre soluzioni.
il codice sotto, non solleva eccezoni, ma nel Db il campo Corpo risulta 
<null>.
 
altra cosa che non capisco: perche' devo leggere da FileStream;
non posso riempire BlobStream con le stringhe ?
 
^^^^^^^^^^^^^^
 
procedure Tfrm_Dati_Email.SetEmailRicevute(dData: TDateTime; sMittente, 
sOggetto: string; sCorpo: TStringList);
var bCorpo: TBlobField;
     BlobStream : TStream;
     FileStream: TFileStream;
     bCorpoStream: TMemoryStream;
     sRiga: string;
     i: integer;
begin
   bCorpoStream := TMemoryStream.Create;
   bCorpoStream.Position := 0;
 
   //scrive stringhe su TMemoryStream
   for i := 1 to sCorpo.Count -1 do
     begin
       sRiga := sCorpo[i];
       bCorpoStream.WriteBuffer(Pointer(sRiga)^, Length(sRiga));
     end;
 
   //salva TMemoryStream su File
   bCorpoStream.SaveToFile(sPath + 'test.dat');
 
   //crea il campo Blob che devo salvare
   BlobStream := 
Cds_MailRic.CreateBlobStream(Cds_MailRic.FieldByName('CORPO'),bmWrite);
 
   //legge lo stream , il file test.dat contiene dati -> size > 0
   FileStream := TFileStream.Create(sPath + 'test.dat', fmOpenRead);
 
   //trasferisce da test.dat al campo Corpo (BlobStream)
   BlobStream.CopyFrom(FileStream, FileStream.Size);
 
   //scrive sul db
   ... non posso assegnare Cds_MailRic.FieldByName('CORPO').As...
   ... ma Cds_MailRic.CreateBlobStream non serve a questo ?
   Cds_MailRic.Post;
 
   //libera risorse BlobStream, FileStream, TMemoryStream
end;

> il messaggio sCorpo e' una TstringList , letta con Indy10
[...]
fatto un test scrivendo direttamente su BlobStream
 
   //trasferisco da TStringList a TMemoryStream
   for i := 1 to sCorpo.Count -1 do
     begin
       sRiga := sCorpo[i];
       //FileStream.Write(sRiga, SizeOf(sRiga) );
       BlobStream.WriteBuffer(Pointer(sRiga)^, Length(sRiga));
     end;
 
     Cds_MailRic.Post;  //AfterPost -> ApplyUpdates(-1) viene eseguito
 
ma il campo CORPO (Blob) resta <null>

>
[...]
 
//questa soluziione, scrive il campo Blob su db.
//mi resta il dubbio di non poter scrivere direttamente nel Buffer di 
BlobStream
 
procedure Tfrm_Dati_Email.SetEmailRicevute(dData: TDateTime; sMittente, 
sOggetto: string; sCorpo: TStringList);
var BlobStream : TStream;
     FileStream: TFileStream;
     i: integer;
begin
       //scrivo StringList su file
       sCorpo.SaveToFile(sPath + 'test.dat');
 
       //crea campo Blob
       BlobStream := 
Cds_MailRic.CreateBlobStream(Cds_MailRic.FieldByName('CORPO'),bmWrite);
 
       //crea FileStram leggendo da file
        FileStream := TFileStream.Create(sPath + 'test.dat',fmOpenRead 
or fmShareDenyNone);
 
        //trasferisce da FileStream a campo Blob
        BlobStream.CopyFrom(FileStream, FileStream.Size);
 
        //libera risorse
        FileStream.Free;
        BlobStream.Free;
 
        //scrive du db
        Cds_MailRic.Post;
...
end;