Ich komme mit dem Beispiel von Embarcadero einfach nicht weiter.
Hier der BeispielCode:
Code:
{-------------------------------------------------------------------------------}
procedure TfrmBlobStr.btnInsertInternalClick(Sender: TObject);
var
oFS: TFileStream;
begin
// All Real BLOB Streaming operations must be performed in a transaction.
FDConnection1.StartTransaction;
try
case FDConnection1.RDBMSKind of
TFDRDBMSKinds.PostgreSQL:
qInsert.SQL.Text := 'insert into {id FDQA_LO} (blobdata) values (:blobdata)';
TFDRDBMSKinds.Oracle:
qInsert.SQL.Text := 'insert into {id FDQA_Blob} (blobdata) values (EMPTY_BLOB()) returning blobdata into :blobdata';
else
qInsert.SQL.Text := 'insert into {id FDQA_Blob} (blobdata) values (:blobdata)';
end;
// Set parameter data type ftStream and do not assign stream reference.
// The internal stream reference will be returned after ExecSQL.
// The internal stream does not perform any conversion (eg, character set).
qInsert.Params[0].DataType := ftStream;
qInsert.Params[0].StreamMode := smOpenWrite;
qInsert.ExecSQL;
oFS := TFileStream.Create(C_File, fmOpenRead);
try
// Write to internal stream. The stream is available after ExecSQL.
qInsert.Params[0].AsStream.CopyFrom(oFS, -1);
finally
oFS.Free;
end;
// Flush / close the streams. Mandatory for
ODBC-based, InterBase and
// Firebird,
MySQL drivers. Optional for other drivers (does nothing).
qInsert.CloseStreams;
Log('BLOB is written - internal streaming');
ShowData;
Log('BLOB is shown');
FDConnection1.Commit;
except
FDConnection1.Rollback;
raise;
end;
end;
Was bedeutet das {id FDQA_Blob} im
SQL-String und (blobdata), muss da nicht der Name des BlobFeldes rein?
Außerdem wird hier mit FileStream gearbeitet und nicht mit MemStream. Ich schreibe mein JPGArray, das ich im Speicher habe doch nicht erst auf die Platte um es dann in den Datensatz zu bekommen.
Angenommen ich habe eine Firebird Datenbank in der alle Daten liegen und einen MemTable in den ich alle Bilddaten der aktuellen ID halte. Felder ID,JPGPic.
In JPGPic soll mein JPegArray[0..119] rein. In dem ist entweder 1 Bild in JPegArray[0] oder 120 Bilder drin.
Ob ftMemTable geht ist noch fraglich, da hier in den Bemerkungen steht:
// The following drivers support Real BLOB Streaming:
// - SQLite (only external streams)
und fdMemtable ist doch SQLite.
Geht das dann überhaupt?
Oder ist Real Blob Streaming hier nicht nötig?