== Working with BLOBs ==
=== Creating Table with BLOB ===
CREATE TABLE MyData (
ID INTEGER NOT NULL,
RECDATE TIMESTAMP NOT NULL,
PARAMVERSION SMALLINT NOT NULL,
PARAMDATA BLOB SUB_TYPE 0 SEGMENT SIZE 2048
);
Blob subtypes definitions are:
0 - binary data (such as image, video, audio, etc.).
1 - text (standard text content).
2 - BLR (used for definitions of Firebird procedures, triggers, etc.).
User applications should only use subtype 0 or 1.
=== Writing BLOBs ===
//------------------------------------------------------------------------------
// description: Post data into BLOB from a user defined data structure.
// parameters : Data: TData; InstrumentID, ProdName: String; qry: TIBQuery
// return : None
//------------------------------------------------------------------------------
procedure PostData(Data: TData; InstrumentID, ProdName: String; qry: TIBQuery);
var
BlobStream: TStream;
Buffer: array [0..2047] of Byte;
pBuffer: Pointer;
pData: Pointer;
i: integer;
begin
// initialize variables
for i:=0 to high(Buffer) do begin
Buffer[i] := 0;
end;
try
if not qry.IsEmpty then begin
qry.Edit; // edit the last entry for the day
end else begin
qry.Insert; // add the entries if none available for the day
end;
// different methods to enter data into record
if qry.State in [dsInsert] then begin
qryPatientNo.Value := '001';
qryFittingDate.AsDateTime := Date();
qryEar.Value := 1;
qryInstrumentID.Value := InstrumentID;
end;
qry.FieldByName('InstrumentID').Value := 'INTU8';
qry.FieldByName('Version').Value := 100;
// store data into blob
BlobStream := qry.CreateBlobStream(qry.FieldByName('Data'), bmWrite); // create stream to read blob
try
pData := @Data;
pBuffer := @Buffer;
move(pData^, pBuffer^, Sizeof(Data)); // move data to buffer array
BlobStream.Write(Buffer[0], Sizeof(Data)); // write buffer array to blob in table
finally
BlobStream.Free;
end;
qry.Post;
except
on E:Exception do begin
ShowMessage('PostData() raised exception ' + E.ClassName + ': '#13#10 + E.Message);
end
end;
end;
=== Reading BLOBs ===
//------------------------------------------------------------------------------
// description: Import data from BLOB into a user defined data structure.
// parameters : Data: TData; qry: TIBQuery
// return : Boolean
//------------------------------------------------------------------------------
function ImportData(var Data: TData; qry: TIBQuery): Boolean;
var
Buffer: array [0..2047] of byte;
pBuffer: Pointer;
pData: Pointer;
BlobStream: TStream; // TBlobStream; does not work
i: integer;
begin
// initialize variables
for i:=0 to high(Buffer) do begin
Buffer[i] := 0;
end;
// read database blob and copy to user defined data structure
pData := @Data;
pBuffer := @arrData;
if not qry.IsEmpty then begin
BlobStream:= qry.CreateBlobStream(qry.FieldByName('Data'), bmReadWrite);
try
BlobStream.Position := 0;
BlobStream.Read(Buffer[0], SizeOf(Data));
move(pBuffer^, pData^, SizeOf(Data));
finally
BlobStream.Free;
end;
result := True;
end else begin
result := False;
end;
end;