2012-03-30 18 views
3

Ich möchte eine Möglichkeit zum Einchecken meiner catch {} -Klausel, wenn die Ausnahme wegen einer referenziellen Integrität verletzt wird, im Moment gehe ich nach der folgenden Methode; Gibt es einen besseren/eleganteren/geeigneteren Weg, um festzustellen, ob es sich um eine Referenzialintegritätsausnahme handelt?So ermitteln Sie, ob es eine referenzielle Integritätsverletzung gibt

public static bool IsReferencialIntegrityExcpetion(this Exception exception) 
     { 
      return exception is SqlException && 
        exception.Message.Contains("The DELETE statement conflicted with the REFERENCE constraint "); 
     } 

Antwort

10

Das beste, was Sie tun können, ist die SqlException anstelle der Exception fangen. Anstatt sich auf die Nachricht zu verlassen, könnten Sie dann die ErrorCode (547) gehen. Und denken Sie daran, dass Sie Ausnahmen stapeln und sie werden in der Reihenfolge behandelt werden (so stellen die spezifischeren Fänge zuerst Ihr Code würde wie folgt aussehen:.

try 
{ 
} 
catch(SqlException sqlEx) 
{ 
    if(sqlEx.ErrorCode == 547) 
     throw; 
} 
catch(Exception ex) 
{ 
    //General error logic 
} 

Wenn Sie eine vollständige Liste der möglichen Fehlercodes möchten, run SELECT * FROM sysmessages gegen die MASTER datenbank

+0

Ah der fehlercode! ja das ist genau das was ich brauche, danke in der tat. –

1

SqlException wird für jede Fehler ausgelöst, die von der Datenbank zurückgegeben wird, unabhängig davon, was verursacht es (RI, Constraint, Typ Mismatch, Größe Mismatch, etc.). Sie können nicht speziell fangen nur RI-basierte Ausnahmen, aber Sie können immer die Ausnahme untersuchen (Ether, wie Sie sind, indem Sie auf die Nachricht oder vorzugsweise durch Blick auf die Errors Eigenschaft) und throw; wieder (beachten Sie, dass es nur throw;, nicht throw ex;, da dies den Stack-Trace erhält, wenn Sie eine bestimmte Ausnahme nicht behandeln möchten.

+0

guter punkt über werfen !! –

Verwandte Themen