(CodeLib-Manager)
Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
|
INSERT - Statement wird nicht ausgeführt
4. Aug 2009, 11:13
Datenbank: Firebird • Version: 2.1 • Zugriff über: ZEOS
*seufz*
Dieser Code
Delphi-Quellcode:
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;
beinhaltet dieses SQL-Statement:
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 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.
Die Tabelle wird so erstellt:
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);
Und mithilfe dieser Funktion wird auf "ID" ein Auto Inc gesetzt:
Delphi-Quellcode:
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');
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?
米斯蘭迪爾 "In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
|