2014-03-02 15 views
15

ich genereate die Erhöhung Fehler in SQL-Prozedur:Fang SQL Raise Fehler in C#

RAISERROR('Already exist',-10,-10)

aber ich kann es nicht den folgenden Code in C# fangen

catch (SqlException ex) 
{ 
    bResult = false;     
    if (ex.Errors[0].Number == -10) 
    { 
     CommonTools.vAddToLog("bInsertNewUser", "ManageUsers", ex.Message); 
     if ((savePoint != null)) 
      savePoint.Rollback(); 
    } 
} 

Wie kann ich den Raise-Fehler in C# abfangen?

+1

Und was ist Ihr genaues Problem? Funktioniert der "Try-Catch" nicht? –

+1

Wenn Sie im Debugger ausgeführt werden, bekommen Sie sogar eine Ausnahme, die in der catch-Klausel endet, und wenn ja, was ist in 'ex.Errors [0] .Number'? –

Antwort

44

raiserrors mit einem SEVERITY Wert unter oder gleich 10 ist nicht auf der C# Seite gefangen, weil ich ihr nur Warnungen betrachtet annehmen wird, wie Sie aus der Liste bei Database Engine Error Severity

SEVERITY Werten zwischen 11 und 16 sind Fehler, die korrigiert werden können durch den Benutzer sehen können, So können Sie zum Beispiel wi versuchen th:

RAISERROR('Already exist',16,1) 

Andernfalls könnten Sie einen anderen Fehlercode aus der Liste oben oder wählen Sie, wenn Sie es wirklich brauchen, Ihre eigene benutzerdefinierte Fehlermeldung sp_addmessage Verwendung vorzubereiten.

+0

Es funktioniert für mich :) Danke –

4

Ihre if-Anweisung ist, wo die Dinge versagen. Angenommen, der erste Fehler in der Sammlung ist in der Tat der, den Sie suchen (möglicherweise nicht).

SqlError.Number ist nicht der Wert, den Sie in RAISERROR festgelegt haben.

Verwenden SqlError.Class die Schwere des Fehlers abzurufen, oder SqlError.State den Zustand zu überprüfen (beide sind -10 in Ihrem Beispiel so schwer zu sagen, welche aus Sie meinen.):

catch (SqlException ex) 
{ 
    bResult = false;     
    if (ex.Errors[0].Class == -10) 
    { 
     CommonTools.vAddToLog("bInsertNewUser", "ManageUsers", ex.Message); 
     if ((savePoint != null)) 
      savePoint.Rollback(); 
    } 
}