Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-Statement wird 2 mal ausgeführt (https://www.delphipraxis.net/12789-sql-statement-wird-2-mal-ausgefuehrt.html)

Nalincah 4. Dez 2003 09:50


SQL-Statement wird 2 mal ausgeführt
 
Wenn ich dieses SQL-Statement ausführe:

SQL-Code:
CREATE TRIGGER InsertIntoEinheiten FOR ADRESSEN AFTER INSERT EXECUTE
(
  INSERT INTO admin.EINHEITEN (Einheit_ID) VALUES ('test');
)
Das ganze führe ich mit meinem Programm so aus:

Delphi-Quellcode:
procedure TDB_Frame.ButtonSQLExecuteClick(Sender: TObject);
begin
  DS.DataSet := Query;
  Query.SQL.Text := MemoSQL.Text;
  try
    Query.ExecSQL;
    Con.GetTableNames(ListBoxTable.Items);
    Query.Active := false;
    Query.Active := true;
    LabelSQLResult.Font.Color := clBlue;
    LabelQueryRecordCount.Caption := IntToStr(Query.RecordCount);
    LabelSQLResult.Caption := 'SQL-Statement erfolgreich ausgeführt';
  except
    On e : exception do
    begin
      LabelSQLResult.Font.Color := clRed;
      LabelSQLResult.Caption := 'Fehler beim ausführen des Statements';
      MemoSQLError.Text := e.Message;
      PageControlSQL.ActivePageIndex := 1;
    end;
  end;
end;
Wenn ich das Statement ausführe, wird der Trigger auch angelegt aber krieg trotzdem folgende Fehlermeldung:

Delphi-Quellcode:
[SAP AG][SQLOD32 DLL][SAP DB]General error;-6006 POS(16) Duplicate name
Der führt das Statement irgendwie doppelt aus. Wenn ich

SQL-Code:
Drop Trigger InsertIntoEinheiten of ADRESSEN
ausführe, sagt der:

Delphi-Quellcode:
[SAP AG][SQLOD32 DLL][SAP DB]General error;-4019 POS(14) Unknown trigger name:INSERTINTOEINHEITEN
Weil er den Trigger halt 2 mal löschen will.

Liegt das irgendwie an meinem Quellcode??

[edit=Admin]SQL-Code in die SQL-Tags eingefügt. Mfg, Daniel[/edit]

MyRealName 4. Dez 2003 10:04

Re: SQL-Statement wird 2 mal ausgeführt
 
ka, was in Deinem SQL-Statement des Memo's wirklich steht, aber folgendes kann dazu führen, daß es zweimal ausgeführt wird :

Zitat:

Query.ExecSQL;
...
Query.Active := false;
Query.Active := true;
ExecSQL führt nämlich das Statement in Query.SQL aus.
Query.Active führt ihn aber auch aus, wenn es True gesetzt wird.

Hoffe, das hilft Dir weiter.

BTW. Warum den Trigger per Programm setzen ? Das macht man einmal bei DB-Definition und dann läßt man ihn in Ruhe, bis man ihn ändern muß. Zum anderen beschreibst Du ein Feld "Einheiten_ID" mit einem String. ID werden normalerweise aber mit Zahlen gemacht. Check das doch mal ;-)

LG, MRN

Nalincah 4. Dez 2003 10:11

Re: SQL-Statement wird 2 mal ausgeführt
 
Danke. Bin im gleichen Moment auch drauf gekommen.

Das ganze ist teil eines DB-Programms. Mit dem kann man DBs öffnen und SQL-Statements ausführen. und dann kann man halt auch selber trigger einrichten. Bin grad am üben.
Das Feld ist VarChar(10) weil die Einheit_ID z.b. auch "AB3UZ" sein kann

Nalincah 4. Dez 2003 10:19

Re: SQL-Statement wird 2 mal ausgeführt
 
Jetzt hab ich leider noch ein Problem:

Delphi-Quellcode:
procedure TDB_Frame.ButtonSQLExecuteClick(Sender: TObject);
begin
  DS.DataSet := Query;
  Query.SQL.Text := MemoSQL.Text;
  try
    Query.ExecSQL;
//    Query.Active := false;
//    Query.Active := true;
    LabelSQLResult.Font.Color := clBlue;
    LabelQueryRecordCount.Caption := IntToStr(Query.RecordCount);
    LabelSQLResult.Caption := 'SQL-Statement erfolgreich ausgeführt';
  except
    On e : exception do
    begin
      LabelSQLResult.Font.Color := clRed;
      LabelSQLResult.Caption := 'Fehler beim ausführen des Statements';
      MemoSQLError.Text := e.Message;
      PageControlSQL.ActivePageIndex := 1;
    end;
  end;
end;
Wenn ich das so mache, dann kracht der bei

Delphi-Quellcode:
LabelQueryRecordCount.Caption := IntToStr(Query.RecordCount);
Weil die Query nicht aktiv ist. Das soll der nur machen ein Select-Statement aufgerufen wird.

Hab mir das erst so überlegt:

Delphi-Quellcode:
if Query.Active = true then
  LabelQueryRecordCount.Caption := IntToStr(Query.RecordCount);
Das geht aber nicht, da ich ja das
Delphi-Quellcode:
Query.Active := true
ausgeklammert habe.
Reinmachen kann ich ja nicht. Und ohne ExecSQL gehts auch nicht.

Wie krieg ich das hin?

MyRealName 4. Dez 2003 10:29

Re: SQL-Statement wird 2 mal ausgeführt
 
Das Problem liegt an der Art des Statements. Es gibt welche mit und welche ohne ResultSet. Einen Trigger zu erstellen hat kein ResultSet, deswegen gibt es auch keine RecordCount. Mach doch einfach 'ne Abfrage, ob Pos('SELECT', ADOQry.SQL.Lines[0]) > 0 ergibt ;-)

Ich kenn nun leider die komp ned wirklich und weiß ned, was die Variablen sonst noch für Möglichkeiten haben, rauszubekommen, was für ein Statement es war. ADOQry.EoF wäre auch ein Ansatz.

LG, MRN

Nalincah 4. Dez 2003 10:31

Re: SQL-Statement wird 2 mal ausgeführt
 
kann ich denn davon ausgehen das ein Select-Statement immer alleine ausgeführt wird???

MyRealName 4. Dez 2003 10:39

Re: SQL-Statement wird 2 mal ausgeführt
 
nicht wirklich ;-)
Aber die Antwort ist trotzdem "Ja"

es gibt auch die Möglichkeit, ein SELECT-Statement auf eine Stored Procedure zu machen, die liefert dann allerdings auch ein ResultSet...

Nalincah 4. Dez 2003 10:47

Re: SQL-Statement wird 2 mal ausgeführt
 
Kannst dir das Programm ja mal angucken

Database Utilities

MyRealName 4. Dez 2003 11:51

Re: SQL-Statement wird 2 mal ausgeführt
 
sorry, wird nix nützen, da bei es bei mir keine ADO-Komps gibt
und hab auch hier ein wenig zu tun auf Arbeit, krieg ja ned umsonst ein Haufen geld ;-)

Nalincah 4. Dez 2003 12:02

Re: SQL-Statement wird 2 mal ausgeführt
 
Ist ja nicht das Projekt, sondern die exe


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.
Seite 1 von 2  1 2      

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