12 votes

Attraper les exceptions de clé unique SQL dans .NET

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.

25voto

marc_s Points 321990

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

2voto

Canavar Points 29161

Pourquoi ne pas simplement demander si l'identifiant unique existe ? C'est mieux que d'obtenir une exception.

2voto

brzozow Points 355

L'analyse du message d'erreur est une mauvaise idée. Par exemple, si vous utilisez Ms SQL, le message peut être localisé (dans une langue différente) et vous ne trouverez pas le mot que vous cherchez.

Si vous utilisez Ms SQL, vous devez vérifier Nombre propriété.

1voto

Nick DeVore Points 4424

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X