Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi FiredDAC Postgres Feldtyp JSON (https://www.delphipraxis.net/213896-fireddac-postgres-feldtyp-json.html)

angos 16. Okt 2023 12:31

Datenbank: PG • Version: 16 • Zugriff über: FireDAC

FiredDAC Postgres Feldtyp JSON
 
Hi zusammen,

ich versuche gerade einen Datensatz in eine Postgres-Tabelle einzutragen, welche ein Feld vom Datentyp "json" beinhaltet.

Hat das jemand schon erfolgreich geschafft?

Folgenden Code führe ich aus:

Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  Params: TFDParams;
  Guid: TGUID;
begin
  CreateGUID(Guid);
  try
    Params := TFDParams.Create;
    Params.Add('guid', Guid.ToString);
    Params.Add('type', '123');
    Params.Add('data', '{"value": "123"}');
    Params.Add('inserted', Now);
    Params.Add('processed', False);

    Params.ParamByName('guid').DataType := ftGuid;

    Params.ParamByName('data').DataType := ftString;
//    Params.ParamByName('data').DataType := ftBlob;
//    Params.ParamByName('data').DataType := ftStream;

    FDConnection1.ExecSQL('INSERT INTO events (guid, type, data, inserted, processed)'
      + ' VALUES (:guid, :type, :data, :inserted, :processed)', Params);
  finally
    Params.Free;
  end;
end;
Folgende Fehlermeldung erhalte ich
Zitat:

[FireDAC][Phys][PG][libpq] FEHLER: Spalte »data« hat Typ json, aber der Ausdruck hat Typ character varying. Sie müssen den Ausdruck umschreiben oder eine Typumwandlung vornehmen.

himitsu 16. Okt 2023 12:42

AW: FiredDAC Postgres Feldtyp JSON
 
Delphi-Quellcode:
    Params.ParamByName('data').DataType := ftString;
    FDConnection1.ExecSQL('INSERT INTO events (guid, type, data, inserted, processed)'
      + ' VALUES (:guid, :type, :data::JSON, :inserted, :processed)', Params);
so?

angos 16. Okt 2023 12:59

AW: FiredDAC Postgres Feldtyp JSON
 
@Himitsu,

Besten Dank!
Nachdem ich zusätzlich gemerkt habe, dass ich so wie oben gar nicht mit den Parametern arbeiten kann (keine Datentypzuweisung nachdem ich einem Parameter einen Wert zugewiesen habe :wall:), hat genau deine Antwort mein eigentliches Problem gelöst. Wieder was gelernt :-)

so läufts:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Params: TFDParams;
  Guid: TGUID;
  Query: TFDQuery;
begin
  Query := TFDQuery.Create(nil);
  try
    CreateGUID(Guid);

    Query.Connection := FDConnection1;
    Query.SQL.Text := 'INSERT INTO events (guid, type, data, inserted, processed)'
      + ' VALUES (:guid, :type, :data::JSON, :inserted, :processed)';

    Query.Params.ParamByName('guid').AsGUID := Guid;
    Query.Params.ParamByName('data').AsString := '{"value": "123"}';
    Query.Params.ParamByName('type').AsString := '123';
    Query.Params.ParamByName('inserted').AsDateTime := Now;
    Query.Params.ParamByName('processed').AsBoolean := False;

    Query.ExecSQL;
  finally
    Query.Free;
  end;
end;

himitsu 16. Okt 2023 15:52

AW: FiredDAC Postgres Feldtyp JSON
 
PS:
Delphi-Quellcode:
Query.ParamByName('guid').AsGUID := TGUID.NewGuid;

bzw.
Delphi-Quellcode:
Query.ParamByName('guid').AsString := TGUID.NewGuid.ToString;


Das erste .Params dürfte bestimmt optional sein.
Wir verwenden allerdings PgDAC.

Mit Datentypen hatten wir vor Kurzem auch Problemchen, da Devart etwas umgebaut hatte und die "automatischen" Datentypen an einigen Stellen nicht mehr funktionierten,
wobei dort der Spaß erst recht begann, wenn man einfach nur die Reihenfolge der Parameter änderte.

angos 17. Okt 2023 09:53

AW: FiredDAC Postgres Feldtyp JSON
 
Jup, recht haste :thumb:

Mit der Angabe der Datentypen an den Parametern scheint das auf jeden Fall super zu funktionieren.

BTW: Womit ich ebenfalls Probleme hatte:
Code:
ParamByName('id').AsGUID
Das hat zwar grundsätzlich funktioniert, aber in der DB stand dann eine andere GUID, als die, die ich eigentlich hatte. Irgendwie scheint Delphi das fehlerhaft umzuwandeln. :?
Aber auch das konnte ich mit :id::UUID lösen


Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 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