[Gelöst] ODBC-Fehler werden nicht korrekt abgefangen

11. August 2011 07:40

Hallo,

wir haben auf unserem Server einen ODBC-Connector zu einer MySQL-Datenbank installiert. Der funktioniert so weit.
Jetzt habe ich in einer statischen Klasse (run on server) eine statischen Methode geschrieben, die nun eine Verbindung über diesen Connector herstellen soll. Das funktioniert auch.

Der Code sieht (vereinfacht) so aus - laut Hilfe ist das auch der Weg:
Code:
try
{
  con = new OdbcConnection(lp);
}
catch
{
  // Fehlerbehandlung
}


Nun zu meinem Problem:
Zum Testen habe ich diesen Code in der main-Methode meiner Klasse ausgeführt und konnte dort auch die Fehler ordentlich abfangen und behandeln.
Ziel ist es aber, obige Methode aus der Insert/Delete/Update-Methode einer Tabelle heraus aufzurufen und dort funktioniert es nicht mehr. Passiert kein Fehler, läuft alles wunderbar. Gibt es einen Fehler beim Verbinden, dann wird der catch-Block "ingnoriert" und der Fehler bleibt unbehandelt - die weiter Verarbeitung ist unterbrochen.

Kann mir jemand sagen, was ich falsch mache?

Beste Grüße,
Sven
Zuletzt geändert von Sven7 am 22. August 2011 07:43, insgesamt 1-mal geändert.

Re: ODBC-Fehler werden nicht korrekt abgefangen

12. August 2011 14:26

Hi Sven,

die Problem ist, dass du innerhalb einer Transaktion (ttsbegin....ttscommit) den try-catch-Block verwendest.

Dynamics AX verwendet beim Einfügen, Ändern oder Löschen von Datensätzen aus Masken automatisch eine Transaktion um diese Operation.
Das kannst du dir ganz einfach ansehen, wenn du z.B. in der Insert-Methode einer Tabelle folgenden Code schreibst:
Code:
info(strfmt("TTS Level: %1", appl.ttsLevel()));


Du solltest sehen, das der TTS-Level immer 1 ist. Somit führt Dynamics AX diese Operation in einer Transaktion aus (in der ersten Ebene).

Das Problem hierbei ist, dass Try-Catch-Blöcke nicht innerhalb einer Transaktion verwendet werden können, bzw. bei einer Transaktion immer die äußerste Try-Catch-Block angesprochen wird, welcher ausserhalb der Transaktion liegt. Somit wird dein Try-Catch-Block ignoriert und der Fehler direkt an das Infolog übergeben.

Noch zwei Beispiele hierzu...

Beispiel 1: Funktioniert nicht! - Ausgabe des Infolog ist "My error".
Code:
ttsBegin;
try
{
    throw error("My error"); 
}
catch
{   
    info("Caught my error");
}
ttsCommit;


Beispiel 2: Funktioniert! - Ausgabe des Infolog ist "My error und Caught my error".
Code:
try
{
    ttsBegin;
    throw error("My error");
    ttsCommit;
}
catch
{   
    info("Caught my error");
}


Damit das ganze nun funktioniert, musst du den Code so "einbauen", dass dieser den äußersten Try-Catch-Block bildet (Beispiel 2) und die Transaction innerhalb des Try-Blocks ausgeführt wird.
Problem hierbei ist aber, dass du somit auch in jeder Maske in der die Tabelle als Datenquelle verwendet wird, die Tabellenoperationen "von Hand" ausführen musst um die automatische Transaktion weg zu bekommen. Das ist mehr als nur nicht schön ist. :-( Deswegen würde ich vorschlagen einen Weg zu suchen, bei dem dein Code nicht auf Ebene einer Tabellenmethode aufgerufen wird.

Re: [Gelöst] ODBC-Fehler werden nicht korrekt abgefangen

22. August 2011 07:43

Das klingt sehr plausibel, vielen Dank!