Einzelnen Beitrag anzeigen

Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: BlobStream in StringGrid speichern

  Alt 19. Mai 2022, 11:54
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?
  Mit Zitat antworten Zitat