AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Oracle Exception im Debug-Modus
Thema durchsuchen
Ansicht
Themen-Optionen

Oracle Exception im Debug-Modus

Ein Thema von Sven M. · begonnen am 27. Mai 2015 · letzter Beitrag vom 28. Mai 2015
Antwort Antwort
Sven M.

Registriert seit: 21. Okt 2006
Ort: Halle/Saale
106 Beiträge
 
Delphi 5 Enterprise
 
#1

Oracle Exception im Debug-Modus

  Alt 27. Mai 2015, 13:27
Datenbank: Oracle • Version: 11 • Zugriff über: FireDac
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?
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
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Oracle Exception im Debug-Modus

  Alt 27. Mai 2015, 15:35
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?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Oracle Exception im Debug-Modus

  Alt 27. Mai 2015, 15:42
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Sven M.

Registriert seit: 21. Okt 2006
Ort: Halle/Saale
106 Beiträge
 
Delphi 5 Enterprise
 
#4

AW: Oracle Exception im Debug-Modus

  Alt 27. Mai 2015, 16:08
@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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Oracle Exception im Debug-Modus

  Alt 27. Mai 2015, 18:02
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 i := StrToIntDef(Edit1.Text, 0); implementiert hätte, damit man im Debugger nicht ständig genervt wird, aber manchmal isses halt so.
$2B or not $2B
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Oracle Exception im Debug-Modus

  Alt 27. Mai 2015, 18:18
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]
Gruß, Jo
  Mit Zitat antworten Zitat
Sven M.

Registriert seit: 21. Okt 2006
Ort: Halle/Saale
106 Beiträge
 
Delphi 5 Enterprise
 
#7

AW: Oracle Exception im Debug-Modus

  Alt 28. Mai 2015, 09:34
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]
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:14 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