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
Antwort Antwort
Seite 1 von 3  1 23      
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
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: INSERT - Statement wird nicht ausgeführt

  Alt 4. Aug 2009, 10:15
Wenn der Trigger greifen soll, lass ID im Insert weg
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;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

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

Re: INSERT - Statement wird nicht ausgeführt

  Alt 4. Aug 2009, 10:18
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.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: INSERT - Statement wird nicht ausgeführt

  Alt 4. Aug 2009, 10:19
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.

if old.id is null
Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

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

Re: INSERT - Statement wird nicht ausgeführt

  Alt 4. Aug 2009, 10:23
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.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: INSERT - Statement wird nicht ausgeführt

  Alt 4. Aug 2009, 10:27
Den Rückgabewert bekommst du auch ohne .Open. Hole einfach den ersten Parameter, den der Name ist meist kryptisch.
Markus Kinzler
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: INSERT - Statement wird nicht ausgeführt

  Alt 4. Aug 2009, 10:30
Eventuell hilft "RequestLive := True" oder "StartTransaction/Commit".
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: INSERT - Statement wird nicht ausgeführt

  Alt 4. Aug 2009, 10:37
Hallo,

ab FB2 gibt es returning
Es sollte hier schon Beispiele geben.

ah, hattest du ja schon.
Die Id steht bei den Parametern drin.


1


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: INSERT - Statement wird nicht ausgeführt

  Alt 4. Aug 2009, 10:38
Und genau dieses Returning steht im Insert-Statement
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

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

Re: INSERT - Statement wird nicht ausgeführt

  Alt 4. Aug 2009, 10:51
Hmm... Nee, das wird immer noch nix bei mir...

Zitat:
Die Id steht bei den Parametern drin.
Und wie kann ich darauf zugreifen?

EntryID := InsertEntryQuery.ParamByName('ID').AsInteger; und

EntryID := InsertEntryQuery.Params[0].AsInteger; funktionieren beide nicht.

Beim ersten existiert der Parameter nicht, beim zweiten bekomme ich eine 0.

@hoika:

RETURNING ZEOS liefert mir z.B. diesen Thread:

http://www.delphipraxis.net/internal...t.php?t=132648

Und der bringt mich erstmal nicht weiter...

Der von dir verlinkte Thread löst mein Problem leider auch nicht, "RET_ID" ist unbekannt...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 21:39 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