Je me demandais si quelqu'un avait une méthode plus élégante pour vérifier les exceptions de clé unique de SQL en .NET autre que l'analyse du message d'erreur ? Pour l'instant, j'appelle la sproc en SQL, puis j'utilise un bloc try catch en .NET. Dans le bloc try catch, si j'analyse le message d'erreur et qu'il s'agit d'une erreur de clé unique, je lance une instance d'erreur personnalisée à la classe appelante, sinon je lance simplement l'exception d'origine à la classe appelante. Cela me semble terriblement inefficace.
Réponses
Trop de publicités?Si vous attrapez une SqlException, vous devriez pouvoir énumérer la collection "Errors" contenant un certain nombre d'objets "SqlError".
La SqlError possède entre autres des propriétés telles que "Class" et "Number" - les violations de clés uniques sont class = 14 et number = 2601. Vérifiez ces nombres pour trouver votre erreur avec précision.
Ce sont les mêmes codes d'erreur que vous obtenez lorsque vous essayez d'exécuter la requête dans SQL Management Studio :
Msg 2601, Niveau 14, État 1, Ligne 1
C l'objet ..........
La déclaration a été clôturée.
Le "Msg" correspond à la propriété "Number" de SqlError, le "Level" à "Class".
try
{
_cmd.ExecuteNonQuery();
}
catch(SqlException sqlExc)
{
foreach (SqlError error in sqlExc.Errors)
{
string msg = string.Format("{0}: {1}", error.Number, error.Message);
}
}
De cette façon, vous pouvez facilement et EXACTEMENT identifier une erreur de type "contrainte unique violée".
Marc
Réponse évidente : Essayez de récupérer cette valeur dans la base de données avant de l'insérer (ou de la mettre à jour) et prévenez l'utilisateur avant d'effectuer l'insertion.
Autre réponse possible : Vérifier l'unicité à l'intérieur du SP et renvoyer le message d'erreur du SP, ce qui évite d'avoir à analyser les erreurs. Elles sont toutes mauvaises.