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?