Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   BINARY Feld auslesen (https://www.delphipraxis.net/214444-binary-feld-auslesen.html)

hawiwo 12. Jan 2024 13:07

Datenbank: Firebird • Version: 4 • Zugriff über: FireDAC

BINARY Feld auslesen
 
Hallo,
mir ist klar, das das hier ein Delphi Forum ist. Evtl. kann mir trotz C++ helfen.
Ich habe eine Datenbank mit einem BINARY(16) Feld, das über einen Trigger beim erstellen eines Datensatzes mit UUID() befüllt wird.
Das funktioniert und select id form tabelle giebt dann sowas wie:
ID
================================
A1AC1E8DA7434FE78332324E99FCDA71
aus.

kann ich das mit folgendem Code auch ausgeben (funktioniert auch):
Code:
      std::stringstream ss;
      ss << "SELECT * FROM DATEN";
      std::string fsql = ss.str();
      FDQuery1->SQL->Text = fsql.c_str();
       try {
         FDQuery1->Open();
          TBytes idBytes = FDQuery1->FieldByName("id")->AsBytes;
          std::stringstream hex;
             for (int i = 0; i < idBytes.Length; ++i)
   {
      // Verarbeite jeden einzelnen Byte, z.B. gib es auf der Konsole aus
      hex << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << static_cast<int>(idBytes[i]);
   }

   std::cout << hex.str() << std::endl;
Ich will jedoch beim Erstellen mit "INSERT INTO TABELLE(FELD1) VALUES ('') RETURNING ID;" die für diesen neuen Datensatz generierte UUID abgreifen und habe dazu:
Code:
      std::stringstream ss;
      ss << "INSERT INTO DATEN (DBK) VALUES('AAA') returning id {into :new_id}";
      std::string fsql = ss.str();
      FDQuery1->SQL->Text = fsql.c_str();

       try {
         FDQuery1->Params->CreateParam(ftByte, "new_id", ptOutput)->DataType = ftBytes;
                 // oder FDQuery1->Params->CreateParam(ftBytes, "new_id", ptOutput);
         FDQuery1->ExecSQL();
         TBytes idBytes = FDQuery1->ParamByName("new_id")->AsBytes;
         for (int i = 0; i < idBytes.Length; ++i)
         {
            std::cout << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << static_cast<int>(idBytes[i]);
         }
      std::cout << std::endl;
jedoch bekomme ich bei der ParamByName Zeile den Fehler:
[bcc64 Fehler] main.cpp(1024): wrong number of index arguments to property. Expecting 1, found 0
genau die Zeile funktioniert im ersten Beispiel.
ich weiß nicht warum...
kann jemand helfen?

Delphi.Narium 12. Jan 2024 13:48

AW: BINARY Feld auslesen
 
Habe annähernd 0 Ahnung zu C++ aber dashier hätte ich anders erwartet:

Statt
Delphi-Quellcode:
 ss << "INSERT INTO DATEN (DBK) VALUES('AAA') returning id {into :new_id}";


eher
Delphi-Quellcode:
ss << "INSERT INTO DATEN (DBK) VALUES('AAA') returning id into {:new_id}";


Kann aber sein, dass ich mich da heftig irre.

hawiwo 12. Jan 2024 14:00

AW: BINARY Feld auslesen
 
hab ich bei https://docwiki.embarcadero.com/RADS...RNING_(FireDAC)
geklaut :-D aber aus Verzweiflung deinen Vorschlag trotzdem ausprobiert. Warum und wo die "wrong number of arguments" ...:?:
in der Zeile TBytes idBytes = FDQuery1->ParamByName("new_id")->AsBytes;

Wenn ich das mit dem Feld DBK und den entsprechenden Typ
Anpassungen mache funktioniert das.

haentschman 12. Jan 2024 14:19

AW: BINARY Feld auslesen
 
Hallöle...😎

Wie wäre es statt
Delphi-Quellcode:
FDQuery1->ExecSQL
mit
Delphi-Quellcode:
FDQuery1->Open
...Das Statement gibt eine Ergebnismenge zurück. (Returning)

hawiwo 12. Jan 2024 14:46

AW: BINARY Feld auslesen
 
verflixt... Das war's:thumb:
Danke


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