![]() |
Datenbank: PostgreSQL • Version: 12 • Zugriff über: FireDac
Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
Hallo,
ich scheitere gerade beim Versuch, auf ein bytea-Attrbut per FDQuery schreibend zuzugreifen und erhalte als Meldung: [FireDAC][Phys][PG]-352. Objektwert für Parameter [DOCBIN] mit dem Typ [ftBlob] wird nicht unterstützt Im Prinzip habe ich das Beispiel von ![]() Meine Tabelle:
Code:
CREATE TABLE stamm.dokument (
"Id" serial NOT NULL, [...] docbin bytea NULL, -- Dokument als Binär-Datei [...] CONSTRAINT "PK_dbversion" PRIMARY KEY ("Id"), [...] ); Mein Delphi Beispiel:
Delphi-Quellcode:
Die Exception gibt mir den oben genannten Fehler.
QWrite.SQL.Text := 'INSERT INTO stamm.dokument ' +
'("Id", docbin) VALUES(1, :DOCBIN);'; QWrite.Params[0].DataType := ftBlob; QWrite.Params[0].AsStream := TFileStream.Create('z:\O\test\test.pdf', fmOpenRead); try QWrite.ExecSQL; except on E:Exception DO DMLog.LogError('BlobTest',E); end; Postgres-Server ist Version 12.... Delphi ist aktuellstes 10.4. Update 2 Mit Veränderung der FireDac-Parameter OidAsBlob=yes und UnknownFormat=BYTEA habe keinen Erfolg. Hat jemand eine Idee? |
AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
Funktioniert es mit DataType := ftStream ?
|
AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
Leider nein, neue Fehlermeldung
Code:
... aber das könnte ein Ansatz sein ...
[FireDAC][Phys][PG][libpq] ERROR: column "docbin" is of type bytea but expression is of type oid.
You will need to rewrite or cast the expression |
AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
|
AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
Zitat:
Ich suche nach einer Lösung, bei der die Dateien am Client liegen und vermute eine Wissenslücke bei FireDac. Mit dem obenen genannten Ansatz kann man Dateien verarbeiten, die bereits am Server liegen, auf dem PostgreSQL läuft. |
AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
Blobs mit FireDAC hatte ich noch nicht probiert, aber ja, die einfachen Dinge laufen gut damit.
Für den Zugriff auf Postgres nutzen wir PgDAC, was natürlich super funktioniert, vor allen die Blobs machen keine Probleme, also die BLOB-Felder in den Tabellen. Nur Umgang mit den alten LargeObjects (LO) würde ich als bissl "umständlich" beschreiben, aber die kann man auch via SQL in ein BlobField konvertieren/joinen (Lesezugriff). (nur bei sowas wie Array-Parametern bin ich gescheitert) Und mit diesem LocalSQL vom FireDAC hatten wir auch schon erfolgreiche kleine Versuche, um damit auf die Query des PgDAC zuzugreifen. Und Zugriff über DataSnap machte Probleme, bei MemoFeldern und ganz besonders bei VARCHAR ohne Längenangabe, da die DB da 64K nahm, aber PgDAC 8K für den RecordSpeicher |
AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
Nachdem ich es noch nicht hinbekommen habe, habe ich mir zwischenzeitlich mit einem Base64 Encodiertem Stream in einem Varchar-Feld geholfen.
Das ging in dem Fall, da die Daten auch mit einer selber gebauten Web-Anwendung wieder geleen werden. Hat halt die DB etwas vergrößert Ich suche aber weiter. Eine andere DB-Engine kommt nicht so ohne weiteres in Frage, da das Schreiben der Blobs nur ein kleiner Teil einer größeren Anwendung ist. |
AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
vielleicht geht es so:
Code:
(geht bei mir unter FireDAC und ZEOS mit Postgres )
ms:=TMemoryStream.Create;
ms.Position:=0; ms.LoadFromFile('xyz.pdf'); ms.Position:=0; if ms.Size > 0 then Params.ParamByName('Dokument').LoadFromStream(ms,ftBlob) |
AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
Das erste Position:=0 ist natürlich nutzlos.
Ich würde hier aber eher ein TFileStream verwenden, denn die Datei doppelt in den RAM zu laden ist etwas platzverschwenderisch, und hier sind dann auch beide Position:=0 unnötig. Am Ende eventuell noch ein
Delphi-Quellcode:
denn wenn in einem vorhandenem Datensatz das gesetzt werden soll, dann darf NULL nicht vergessen werden.
else
Params.ParamByName('Dokument').Clear; |
AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
Danke. So geht es.
Ich halte fest:
Delphi-Quellcode:
geht nicht, aber
QWrite.Params[1].AsStream := iFStreeam;
Delphi-Quellcode:
funktioniert wie erwartet.
QWrite.Params[1].LoadFromStream(iFStreeam,ftBlob);
Über das Warum mache ich mir später Gedanken. Unterschied der beiden Aufrufe lt. Doku ist noch, dass bei ersterem der Stream an FireDAC übergeben würde, bei zweiterem muss man den Stream selber freigeben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz