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 #?
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 .
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();
}
}
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 #:
* (ne jette rien) ┬──┬
** (16 = général)
***(erreur fatale)