![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: ZEOS
INSERT - Statement wird nicht ausgeführt
*seufz*
Dieser Code
Delphi-Quellcode:
beinhaltet dieses SQL-Statement:
procedure TDGHBDatabase.AddEntry(Entry: TDGHBEntry);
var InsertEntryQuery : TZQuery; GetUserIDQuery: TZQuery; GetCategoryIDQuery: TZQuery; I, UserID: Integer; CategoryID: Integer; CurrDay, CurrMonth, CurrYear: Word; EntryID: Integer; begin InsertEntryQuery := TZQuery.Create(nil); GetUserIDQuery := TZQuery.Create(nil); GetCategoryIDQuery := TZQuery.Create(nil); if not fIgUser then begin with GetUserIDQuery do begin Connection := fConnection; ParamCheck := true; SQL.Text := 'SELECT ID FROM USERS WHERE USER_NAME = :user'; ParamByName('user').AsString := Entry.User; Open; UserID := FieldByName('ID').AsInteger; end; end else UserID := -1; with GetCategoryIDQuery do begin Connection := fConnection; ParamCheck := true; SQL.Text := 'SELECT ID FROM CATEGORIES WHERE CATEGORIE_NAME = :cat'; ParamByName('cat').AsString := Entry.Categorie; Open; CategoryID := FieldByName('ID').AsInteger; end; with InsertEntryQuery do begin Connection := fConnection; ParamCheck := true; SQL.Text := 'INSERT INTO EXPENSES (ID, EXP_TYPE, EXP_VALUE, EXP_CATEGORY, EXP_COMMENT, EXP_USER, EXP_DAY, EXP_MONTH, EXP_YEAR, EXP_LUX)' + ' VALUES (:id, :exp_type, :exp_value, :exp_category, :exp_comment, :exp_user, :exp_day, :exp_month, :exp_year, :exp_lux) RETURNING "ID";'; ParamByName('exp_type').AsInteger := Integer(Entry.EntryType); ParamByName('exp_value').AsFloat := Entry.Value; ParamByName('exp_category').AsInteger := CategoryID; ParamByName('exp_comment').AsString := ''; ParamByName('exp_user').AsInteger := UserID; DecodeDate(Entry.Date, CurrYear, CurrMonth, CurrDay); ParamByName('exp_day').AsInteger := CurrDay; ParamByName('exp_month').AsInteger := CurrMonth; ParamByName('exp_year').AsInteger := CurrYear; ParamByName('exp_lux').AsInteger := BoolToInt(Entry.Luxury); Open; EntryID := FieldByName('ID').AsInteger; end; for i := 0 to Entry.Tags.Count - 1 do begin AddTermRelation(GetTermNameToID(Entry.Tags[i]), EntryID); end; InsertEntryQuery.Free; GetUserIDQuery.Free; GetCategoryIDQuery.Free; end;
SQL-Code:
Die Funktion wird ohne murren durchlaufen, nur am Ende wird kein Eintrag der DB hinzugefügt. Ich habe das Statement schon durch einen Validator gejagt, in der Hoffnung, dass Zeos einfach nur eine Felermeldung verschluckt. Aber das Statement ist gültig. Und ich bin der festen Überzeugung, dass es auch schonmal funktionierte. Aber jetzt geht es nicht mehr, und ich habe keine Ahnung, warum. :wall:
INSERT INTO EXPENSES (ID, EXP_TYPE, EXP_VALUE, EXP_CATEGORY, EXP_COMMENT, EXP_USER, EXP_DAY, EXP_MONTH, EXP_YEAR, EXP_LUX) VALUES (:id, :exp_type, :exp_value, :exp_category, :exp_comment, :exp_user, :exp_day, :exp_month, :exp_year, :exp_lux) RETURNING "ID";
Die Tabelle wird so erstellt:
SQL-Code:
Und mithilfe dieser Funktion wird auf "ID" ein Auto Inc gesetzt:
CREATE TABLE EXPENSES (ID INTEGER, EXP_TYPE INTEGER, EXP_VALUE FLOAT, EXP_CATEGORY INTEGER, EXP_COMMENT CHAR(255) CHARACTER SET NONE, EXP_USER INTEGER, EXP_DAY INTEGER, EXP_MONTH INTEGER, EXP_YEAR INTEGER, EXP_LUX INTEGER);
Delphi-Quellcode:
Der Rückgabewert von ID ist übrigens 1. INSERT-Statements im Allgemeinen funktionieren, nur dieses spezielle halt nicht... Hat jemand eine Idee/Anregungen, wo ich noch gucken kann bzw. was das Problem sein kann?
procedure TDGHBDatabase.FireBirdAutoInc(const zConnection: TZConnection; Table, forField: string; IsGlobal: Boolean = false);
var zQuery: TZQuery; begin zQuery := TZQuery.Create(nil); try with zQuery do begin // Verbindung festlegen und prüfen Connection := zConnection; if Assigned(Connection) and Connection.Connected then begin // Generator erzeugen SQL.Text := 'CREATE GENERATOR ' + Table + '_AUTOINC;'; ExecSQL; // Generator mit Spalte verbinden SQL.Text := 'SET GENERATOR ' + Table + '_AUTOINC TO 0'; ExecSQL; // Trigger definieren SQL.Clear; SQL.Add('CREATE TRIGGER ' + Table + '_AUTOINC_TRG for ' + Table); SQL.Add('active before insert position 0'); SQL.Add('as'); SQL.Add('begin'); SQL.Add(' new.' + forField + ' = gen_id( ' + Table + '_AUTOINC, 1 );'); SQL.Add('end'); ExecSQL; end; // if Assigned... end; // with zQuery do finally zQuery.Free; end; end; FireBirdAutoInc(fConnection, 'EXPENSES', 'ID'); |
Re: INSERT - Statement wird nicht ausgeführt
Wenn der Trigger greifen soll, lass ID im Insert weg
SQL-Code:
INSERT INTO EXPENSES ( EXP_TYPE, EXP_VALUE, EXP_CATEGORY, EXP_COMMENT, EXP_USER, EXP_DAY, EXP_MONTH, EXP_YEAR, EXP_LUX) VALUES (:exp_type, :exp_value, :exp_category, :exp_comment, :exp_user, :exp_day, :exp_month, :exp_year, :exp_lux) RETURNING ID;
|
Re: INSERT - Statement wird nicht ausgeführt
Moin Markus,
ok, das ist dann wieder mein Ursprungsstatement, da ich dachte, es könnte daran liegen. Danke für den Hinweis, aber das Problem löst es leider nicht. :( |
Re: INSERT - Statement wird nicht ausgeführt
Hallo,
du schreibst ja auch Open statt ExecSQL. Der Trigger greift hier übrigens immer, ob die ID mit angibst oder nicht. Das liegt aber am Trigger-Code. Sollte das geändert werden (nicht empfehlenswert, weil ja schon ein Generator da ist), muss sowas im Trigger stehen.
SQL-Code:
if old.id is null
Heiko |
Re: INSERT - Statement wird nicht ausgeführt
Ja, aber wie komme ich dann sonst an den Rückgabewert ("ID")? Hast übrigens Recht, dann funktioniert es. Aber dann ist das Feld "ID" nicht bekannt in der nächsten Zeile.
Und ich hatte das so verstanden, dass, wenn man einen Rückgabewert erwartet, man Open; nutzen muss. |
Re: INSERT - Statement wird nicht ausgeführt
Den Rückgabewert bekommst du auch ohne .Open. Hole einfach den ersten Parameter, den der Name ist meist kryptisch.
|
Re: INSERT - Statement wird nicht ausgeführt
Eventuell hilft "RequestLive := True" oder "StartTransaction/Commit".
|
Re: INSERT - Statement wird nicht ausgeführt
Hallo,
ab FB2 gibt es returning Es sollte hier schon Beispiele geben. ah, hattest du ja schon. Die Id steht bei den Parametern drin. ![]() Heiko |
Re: INSERT - Statement wird nicht ausgeführt
Und genau dieses Returning steht im Insert-Statement :zwinker:
|
Re: INSERT - Statement wird nicht ausgeführt
Hmm... Nee, das wird immer noch nix bei mir...
Zitat:
Delphi-Quellcode:
und
EntryID := InsertEntryQuery.ParamByName('ID').AsInteger;
Delphi-Quellcode:
funktionieren beide nicht.
EntryID := InsertEntryQuery.Params[0].AsInteger;
Beim ersten existiert der Parameter nicht, beim zweiten bekomme ich eine 0. @hoika: RETURNING ZEOS liefert mir z.B. diesen Thread: ![]() Und der bringt mich erstmal nicht weiter... :( Der von dir verlinkte Thread löst mein Problem leider auch nicht, "RET_ID" ist unbekannt... :? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz