[DUG] Blob primer

Robert martin rob at wildsoft.co.nz
Fri Jul 1 10:01:41 NZST 2005


Hi.

Dont know if this helps but here is how we load and seve data (cut from 
code messily).  We are using IBO and Firebird.

    with zMainDM.GeneralIB_Query do begin
        IB_Transaction.StartTransaction;
        try
            SQL.Text := 'SELECT r.FileName, ra.FileBlob ' +
                        'FROM ReportActivity ra ' +
                        'JOIN Report r ON r.ReportRef = ra.ReportRef ' +
                        'WHERE ra.ActivityRef = :ActivityRef;';
            Prepare;

                            //Extract Archived file
                            FileStream := TFileStream.Create(FileName + 
't', fmCreate);
                            try
                                DBStream := 
CreateBlobStream(FieldByName('FileBlob'), bsmRead);
                                try
                                    FileStream.CopyFrom(DBStream, 0);
                                finally
                                    DBStream.Free;
                                end;
                            finally
                                FileStream.Free;
                            end;
...

//The above runs an SQL to select the desire blob and saves it to a file 
(with an extra 't' in the name for obscure reasons :) )






                    zMainDM.InsertActivityIB_Query.SQL.Text := 'INSERT 
INTO ReportActivity ' +
                                                                
'(ActivityRef, ReportRef, VersionNo, rDate, rTime, Comment, UserRef, 
Activity, FileBlob, Approved, Canceled) ' +
                                                                'VALUES ' +
                                                                
'(:ActivityRef, :ReportRef, :VersionNo, :rDate, :rTime, :Comment, 
:UserRef, :Activity, :FileBlob, :Approved, ''F'');';
                    zMainDM.InsertActivityIB_Query.Prepare;

.....

                //Compress Report and insert into query
                CompLHA.ForceUpperCase := False;
                CompLHA.FilesToProcess.Clear;
                CompLHA.FilesToProcess.Add(InEdit.Text);
                CompLHA.ArchiveName := ExtractFileName(InEdit.Text);
                CompLHA.CompressionMethod := colh5;

                SList   := TStringList.Create;
                Stream  := TMemoryStream.Create;
                try
                    SList.Add(InEdit.Text);

                    CompLHA.CompressFilesToStream(Stream, SList, colh5);

                    //Stream now contains compressed file, copy to 
insert statement
                    DBStream := 
zMainDM.InsertActivityIB_Query.CreateBlobStream(zMainDM.InsertActivityIB_Query.ParamByName('FileBlob'), 
bsmWrite);

                    DBStream.CopyFrom(Stream, 0);
                finally
                    Stream.Free;
                    SList.Free;
                end;


The above has an insert SQL to load the blob.  It compresses the file 
and loads it into the query to insert.  You could replace the CompLHA 
stuff with a std stream load.



It is really quite simple to use, just a mix of SQL and TStreams.



Rob Martin
Software Engineer

phone +64 03 377 0495
fax   +64 03 377 0496
web www.chreos.com

Wild Software Ltd



Phil Middlemiss wrote:

> Could anyone give me a link to a "how-to" about blobs? I'm using D6 
> with firebird - there is no GUI (it's a service) so I would like to 
> just use SQL if possible.
>
> Having not used blobs before I'm wondering:
> - what is a subtype? The Interbase documentation assumes you know
> - what is a good size for the segment length
> - how to specify binary data in a sql - if it's actually possible.
> - if I can't just use sql then what's the best way?
>
> Phil.
>
> _______________________________________________
> Delphi mailing list
> Delphi at ns3.123.co.nz
> http://ns3.123.co.nz/mailman/listinfo/delphi
>


More information about the Delphi mailing list