web-dev-qa-db-fra.com

Erreur SQL de rattrapage SQL en C #

Je génère l'erreur de remontée dans la procédure SQL:

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

mais je ne peux pas l'attraper en utilisant le code suivant en C # 

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

Comment puis-je intercepter l'erreur générée en C #?

17
Raed Alsaleh

Les RAISERROR avec une valeur de gravité inférieure ou égale à 10 ne sont pas interceptés du côté C # car je suppose qu'ils sont considérés comme de simples avertissements, comme vous pouvez le voir dans la liste En Database Engine Error Severity

Les valeurs SEVERITY comprises entre 11 et 16 sont des erreurs pouvant être corrigées par l'utilisateur. Vous pouvez par exemple essayer avec:

RAISERROR('Already exist',16,1)

Sinon, vous pouvez choisir un autre code d'erreur dans la liste ci-dessus ou, si vous en avez vraiment besoin, préparez votre propre message d'erreur personnalisé à l'aide de sp_addmessage .

48
Steve

Votre déclaration si est où les choses échouent. En supposant que la première erreur dans la collection est bien celle que vous recherchez (ce n'est peut-être pas le cas).

SqlError.Number n'est pas la valeur que vous avez définie dans RAISERROR.

Utilisez SqlError.Class pour récupérer la gravité de l’erreur ou SqlError.State pour vérifier l’état (les deux sont -10 dans votre exemple. Si difficile de dire de quelle sortie vous parlez):

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

Utilisez un code d'erreur compris entre 11 et 16, ou utilisez simplement 16 pour un cas "général".

RAISERROR('Already exists',16,1)

Pourquoi? Voici mon résumé de https://docs.Microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-error-severities?view=sql-server-2017 :

SQL RAISERROR -> C #:

  • 0-10 = fyi *
  • 11-16 = vous pouvez y remédier **
  • 17-19 = obtenir l'aide de l'administrateur
  • 20-24 = certainement obtenir de l'aide administrateur ***

* (ne jette rien) ┬──┬

** (16 = général)

***(erreur fatale)

0
hchiam