Comment Identifier la clé primaire de la duplication à partir d'un Serveur SQL server 2008 code d'erreur?
Je veux savoir comment on peut identifier la clé primaire erreur de duplication de code d'erreur SQL Server en C#.
Comme un exemple, j'ai un C# formulaire pour entrer des données dans une base de données SQL Server, lorsqu'une erreur se produit lors de la saisie de données, comment puis-je identifier la raison de l'erreur de l'exception?
OriginalL'auteur Roshan | 2013-03-05
Vous devez vous connecter pour publier un commentaire.
Si vous attrapez SqlException alors voir son nombre, le nombre
2627
signifierait violation de contrainte d'unicité (y compris la clé primaire).MSSQL_ENG002627
SqlException
, pasSystem.Exception
, si vous les utilisez à la fois, assurez-vous que de plus en plus spécifiques exception a son bloc catch au-dessus de la moindre exception spécifique (dans ce cas, le bloc catch deSqlException
doit être au-dessus du bloc catch deException
).Je crois 2601 peut également être une violation de contrainte d'unicité
également intéressant de noter que vous pouvez utiliser exception de filtrage si vous vous retrouvez avec:
try{ //insertion code } catch(SqlException ex) when (ex.Number == 2627){ //do something }
OriginalL'auteur Habib
C'est un vieux thread mais je pense qu'il est intéressant de noter que, depuis C#6, vous pouvez:
Et avec C#7 et un emballage exception (comme Entity Framework Core):
Le plus grand avantage de cette approche en comparaison avec l'acceptées réponse est:
Dans le cas où le numéro d'erreur est pas égal à 2627 et par conséquent, il n'est pas une clé unique de la violation, l'exception n'est pas pris.
Sans le filtre d'exception (
when
) vous feriez mieux de rappeler re-lancement de cette exception, dans le cas où vous ne pouvez pas le gérer. Et, idéalement, ne pas oublier d'utiliserExceptionDispatchInfo
de sorte que, à l'origine de la pile n'est pas perdu.OriginalL'auteur Bruno Garcia
En cas d'Entity Framework, la accepté de répondre ne fonctionne pas et l'erreur de ne pas être pris. Voici un code de test, seule l'entité instruction catch va être frappé ou des cours pour le générique de l'exception si l'entité déclaration supprimée:
OriginalL'auteur usefulBee