Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Mit FireDac auf bytea Attribut unter PostgreSQL schreiben (https://www.delphipraxis.net/207732-mit-firedac-auf-bytea-attribut-unter-postgresql-schreiben.html)

bnreimer42 27. Apr 2021 19:39

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 http://docwiki.embarcadero.com/RADSt...ing_in_FireDAC mit angepasster Datenstruktur probiert.

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:
 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;
Die Exception gibt mir den oben genannten Fehler.

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?

Union 27. Apr 2021 20:56

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
 
Funktioniert es mit DataType := ftStream ?

bnreimer42 27. Apr 2021 21:42

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
 
Leider nein, neue Fehlermeldung

Code:
[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
... aber das könnte ein Ansatz sein ...

Klaus01 28. Apr 2021 07:40

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
 
.. vielleicht zeigt das eine mögliche Lösung.

Grüße
Klaus

bnreimer42 28. Apr 2021 08:31

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
 
Zitat:

Zitat von Klaus01 (Beitrag 1488038)
.. vielleicht zeigt das eine mögliche Lösung.

Grüße
Klaus

Danke!

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.

himitsu 28. Apr 2021 08:52

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

bnreimer42 13. Mai 2021 20:54

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.

RSF 14. Mai 2021 14:57

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
 
vielleicht geht es so:
Code:
ms:=TMemoryStream.Create;
ms.Position:=0;
ms.LoadFromFile('xyz.pdf');
ms.Position:=0;
if ms.Size > 0 then
Params.ParamByName('Dokument').LoadFromStream(ms,ftBlob)
(geht bei mir unter FireDAC und ZEOS mit Postgres )

himitsu 14. Mai 2021 16:01

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:
else
  Params.ParamByName('Dokument').Clear;
denn wenn in einem vorhandenem Datensatz das gesetzt werden soll, dann darf NULL nicht vergessen werden.

bnreimer42 14. Mai 2021 22:08

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
 
Danke. So geht es.

Ich halte fest:

Delphi-Quellcode:
QWrite.Params[1].AsStream := iFStreeam;
geht nicht, aber

Delphi-Quellcode:
QWrite.Params[1].LoadFromStream(iFStreeam,ftBlob);
funktioniert wie erwartet.

Ü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 19:50 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz