AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Mit FireDac auf bytea Attribut unter PostgreSQL schreiben
Thema durchsuchen
Ansicht
Themen-Optionen

Mit FireDac auf bytea Attribut unter PostgreSQL schreiben

Ein Thema von bnreimer42 · begonnen am 27. Apr 2021 · letzter Beitrag vom 14. Mai 2021
Antwort Antwort
Seite 1 von 2  1 2      
bnreimer42

Registriert seit: 26. Mai 2013
Ort: Erlangen, Franken
126 Beiträge
 
Delphi 12 Athens
 
#1

Mit FireDac auf bytea Attribut unter PostgreSQL schreiben

  Alt 27. Apr 2021, 19:39
Datenbank: PostgreSQL • Version: 12 • Zugriff über: FireDac
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?
Björn Reimer

Geändert von bnreimer42 (27. Apr 2021 um 22:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben

  Alt 27. Apr 2021, 20:56
Funktioniert es mit DataType := ftStream ?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
bnreimer42

Registriert seit: 26. Mai 2013
Ort: Erlangen, Franken
126 Beiträge
 
Delphi 12 Athens
 
#3

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben

  Alt 27. Apr 2021, 21:42
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 ...
Björn Reimer

Geändert von bnreimer42 (27. Apr 2021 um 22:49 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben

  Alt 28. Apr 2021, 07:40
.. vielleicht zeigt das eine mögliche Lösung.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
bnreimer42

Registriert seit: 26. Mai 2013
Ort: Erlangen, Franken
126 Beiträge
 
Delphi 12 Athens
 
#5

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben

  Alt 28. Apr 2021, 08:31
.. 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.
Björn Reimer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben

  Alt 28. Apr 2021, 08:52
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
$2B or not $2B

Geändert von himitsu (28. Apr 2021 um 09:27 Uhr)
  Mit Zitat antworten Zitat
bnreimer42

Registriert seit: 26. Mai 2013
Ort: Erlangen, Franken
126 Beiträge
 
Delphi 12 Athens
 
#7

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben

  Alt 13. Mai 2021, 20:54
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.
Björn Reimer
  Mit Zitat antworten Zitat
RSF

Registriert seit: 13. Mär 2008
155 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben

  Alt 14. Mai 2021, 14:57
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 )
Ronald

Geändert von RSF (14. Mai 2021 um 15:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben

  Alt 14. Mai 2021, 16:01
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.
$2B or not $2B
  Mit Zitat antworten Zitat
bnreimer42

Registriert seit: 26. Mai 2013
Ort: Erlangen, Franken
126 Beiträge
 
Delphi 12 Athens
 
#10

AW: Mit FireDac auf bytea Attribut unter PostgreSQL schreiben

  Alt 14. Mai 2021, 22:08
Danke. So geht es.

Ich halte fest:

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

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.
Björn Reimer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 Uhr.
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