AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi FiredDAC Postgres Feldtyp JSON
Thema durchsuchen
Ansicht
Themen-Optionen

FiredDAC Postgres Feldtyp JSON

Ein Thema von angos · begonnen am 16. Okt 2023 · letzter Beitrag vom 17. Okt 2023
Antwort Antwort
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#1

FiredDAC Postgres Feldtyp JSON

  Alt 16. Okt 2023, 13:31
Datenbank: PG • Version: 16 • Zugriff über: FireDAC
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.
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: FiredDAC Postgres Feldtyp JSON

  Alt 16. Okt 2023, 13:42
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?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: FiredDAC Postgres Feldtyp JSON

  Alt 16. Okt 2023, 13:59
@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 ), 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;
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: FiredDAC Postgres Feldtyp JSON

  Alt 16. Okt 2023, 16:52
PS: Query.ParamByName('guid').AsGUID := TGUID.NewGuid;
bzw. 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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (16. Okt 2023 um 16:58 Uhr)
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: FiredDAC Postgres Feldtyp JSON

  Alt 17. Okt 2023, 10:53
Jup, recht haste

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ß
Ansgar
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:06 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