Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Oracle Exception im Debug-Modus (https://www.delphipraxis.net/185273-oracle-exception-im-debug-modus.html)

Sven M. 27. Mai 2015 12:27

Datenbank: Oracle • Version: 11 • Zugriff über: FireDac

Oracle Exception im Debug-Modus
 
Tach zusammen :)

Ich versuche via FireDac auf eine Oracle-DB zuzugreifen, was soweit auch erstmal ganz gut funktioniert. Nun besteht aber die Notwendigkeit, bei Programmstart einen Trigger zu erstellen, der dann bei Programmende wieder gedroppt wird.

Codemäßig sieht das im FormShow folgendermaßen aus:

Delphi-Quellcode:
  DBCOnnection.Open;
  QueryData.Open;
  QueryTriggerExists.Open;
  AlerterDataChange.Register;

  if QueryTriggerExists.RecordCount=0 then
  begin
    DBCommand.CommandText.Clear;
    DBCommand.CommandText.Add('CREATE OR REPLACE TRIGGER PROD.TR_CHANGE_TABLE_DATA');
    DBCommand.CommandText.Add('AFTER DELETE OR INSERT OR UPDATE ON PROD.DATA');
    DBCommand.CommandText.Add('BEGIN');
    DBCommand.CommandText.Add('SYS.DBMS_ALERT.SIGNAL (''DATA_CHANGE'', ''TEST_ALERT'');');
    DBCommand.CommandText.Add('END;');
    DBCommand.Execute;
  end;
Während der Programmausführung kommen die extern herbeigeführten Änderungen (über APEX) auch problemlos im verknüpften DBGrid an.
Beim Schließen des Fensters soll dann der Trigger aber wieder gelöscht werden:

Delphi-Quellcode:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  AlerterDataChange.Unregister;
  QueryTriggerExists.Refresh;
  if QueryTriggerExists.RecordCount>0 then
  begin
    //trigger erst deaktivieren, dann löschen
    DBCommand.Execute('ALTER TRIGGER PROD.TR_CHANGE_TABLE_DATA DISABLE');
    DBCommand.Execute('DROP TRIGGER PROD.TR_CHANGE_TABLE_DATA');
  end;

  DBConnection.Close;
end;
Und hier tritt folgendes Phänomen auf. Im Debug-Modus aus Delphi heraus bekomme ich eine EOCINativeException:
"[FireDac][Phys][Ora] ORA-01013: Benutzer hat Abbruch des aktuellen Vorgangs angefordert"
Starte ich die kompilierte Exe aber ohne die IDE funktioniert alles problemlos. Kann mir das Phänomen jemand erklären? :D
Oder mache ich prinzipiell etwas falsch? Muss dazu sagen, dass Oracle generell und der Zugriff via Firedac noch ziemliche böhmische Dörfer für mich sind. ;)



Vieln Dank im Voraus
Sven

jobo 27. Mai 2015 14:35

AW: Oracle Exception im Debug-Modus
 
Ich schätze das ist einfach ein Timingproblem im Debugmode und/oder auch eine Frage der Abarbeitung der Events.
Die Fehlermeldung ist von Oracle und bedeutet einfach, dass die Operation vor Beendigung abgebrochen wurde.
Das kann ok sein, insbesondere mit diesem Trigger. Der kann ja permanent feuern.
Zum Trigger noch eine Frage: Bist Du sicher, dass Du das so haben willst? In welchem Kontext wird der Trigger gesetzt? Je User?
Ansonsten wird er zigmal erstellt und gelöscht, jenachdem wer sich (wie oft) anmeldet. Oder läuft immer nur eine Instanz der Anwendung?

himitsu 27. Mai 2015 14:42

AW: Oracle Exception im Debug-Modus
 
Wird die Exception nur im Debugger angezeigt, oder hat diese Excption auch Auswirkungen auf das Programm?
  • Excepiton wird auch im Programm angezeigt
  • die Exception ändert die Funktionsweise des Programms

Es gibt in Programmen öfters mal Exceptions (PS: Beim Start von der Delphi XE-IDE gibt es mehrere Exceptions, aber die werden alle nicht angezeigt und man sieht sie somit nur dann, wenn man die IDE debuggt)

Sven M. 27. Mai 2015 15:08

AW: Oracle Exception im Debug-Modus
 
@jobo
Der Trigger kann nur feuern, wenn ich die Änderung manuell anstoße. Denn die Änderung der Datensätze ist nur über das existierende Webinterface möglich, das kann nur ich kontrollieren und beeinflussen.
Ansonsten ist es in der Tat so, dass nur eine Instanz der Anwendung läuft.

@himitsu:
Die Exception wird ausschließlich im Debugger angezeigt und hat ansonsten keine Auswirkungen. Klar, ich könnte jetzt sagen "läuft doch". Aber das widerstrebt irgendwie meinen Vorstellungen, weil ich das Gefühl habe, dass da was im Argen liegt, das ich gerne geklärt hätte. ;)


Beim Rumprobieren ermittelt:
Das Problem scheint der EventAlerter zu sein. Lösche ich den, funktioniert alles hervorragend, ohne Exception. Aber das kann doch nicht die Lösung sein...:?

himitsu 27. Mai 2015 17:02

AW: Oracle Exception im Debug-Modus
 
Dann ist das eine "behandelte" Exception ... kannst'e ignorieren, auch wenn es unschön ist.


PS:
Delphi-Quellcode:
try
  i := StrToInt(Edit1.Text);
except
  i := 0;
end;
Im laufenden Programm ist es nicht zu sehn und natürlich wäre es schöner, wenn man es als
Delphi-Quellcode:
i := StrToIntDef(Edit1.Text, 0);
implementiert hätte, damit man im Debugger nicht ständig genervt wird, aber manchmal isses halt so.

jobo 27. Mai 2015 17:18

AW: Oracle Exception im Debug-Modus
 
Ich denke auch, dass die Exception selbst unproblematisch ist.
Aber
[OT]
Ich versteh ehrlich gesagt nicht, warum Du den Trigger bei Programmstart erzeugst und am Ende wieder löscht.
Jeglicher Konsument dieser Events könnte da falsche Schlüsse ziehen, außer vielleicht, Du bist Dein eigener Konsument.
[/OT]

Sven M. 28. Mai 2015 08:34

AW: Oracle Exception im Debug-Modus
 
Ok, dann nehme ich das mal so hin. Danke euch beiden! :)



@jobo
[OT]
Zur Verdeutlichung:
Wir haben eine DB beim Kunden, die von einer anderen Abteilung erstellt und administriert wird. Nun soll meine Abteilung eine Software schreiben, für die dieser Trigger nötig ist. Um keine unnötige Verwirrung zu stiften, soll der Trigger nur dann existieren, wenn er gebraucht wird. Sprich: Unsere zu entwickelnde Anwendung ist der einzige Anlaufpunkt für diesen Trigger. Hoffe, es ist deutlicher geworden, was wir machen wollen?!:)
[/OT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 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