Einzelnen Beitrag anzeigen

Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#1

INSERT - Statement wird nicht ausgeführt

  Alt 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
  Mit Zitat antworten Zitat