AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi INSERT - Statement wird nicht ausgeführt
Thema durchsuchen
Ansicht
Themen-Optionen

INSERT - Statement wird nicht ausgeführt

Ein Thema von Mithrandir · begonnen am 4. Aug 2009 · letzter Beitrag vom 4. Aug 2009
 
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, 10: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 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