web-dev-qa-db-fra.com

Meilleure façon de détecter les violations de contraintes uniques SQL en C # lors des insertions

J'ai une boucle en c # qui s'insère dans une table. trucs assez basiques. Y at-il quelque chose dans l'objet exception renvoyé lorsqu'une contrainte unique est violée et que je peux utiliser pour voir quelle est la valeur incriminée?

Ou y a-t-il un moyen de le retourner dans le sql? J'ai une série de fichiers dont les données sont chargées dans des tableaux et je me tape la tête en essayant de trouver la dupe.

Je sais que je pourrais taper ensemble quelque chose de code purement basé sur IO, mais je voudrais quelque chose que je pourrais utiliser comme solution plus permanente. 

16
user609926

Ce que vous recherchez est une exception SqlException, en particulier la violation des contraintes de clé primaire. Vous pouvez obtenir cette erreur spécifique de cette exception en consultant la propriété number de l'exception levée. Cette réponse est probablement pertinente pour ce dont vous avez besoin: Comment identifier la duplication de clé primaire à partir d'un code d'erreur SQL Server 2008?

En résumé, cela ressemble à ceci:

// put this block in your loop
try
{
   // do your insert
}
catch(SqlException ex)
{
   // the exception alone won't tell you why it failed...
   if(ex.Number == 2627) // <-- but this will
   {
      //Violation of primary key. Handle Exception
   }
}

MODIFIER:

Cela peut paraître un peu compliqué, mais vous pouvez aussi simplement inspecter le composant message de l’exception. Quelque chose comme ça:

if (ex.Message.Contains("UniqueConstraint")) // do stuff
19
Bill Sambrone

Vous pouvez insérer l'insertion dans une procédure stockée qui a d'abord validé l'absence de doublons avant l'insertion. De cette façon, vous pouvez contrôler exactement ce qui revient lorsque la valeur est dupliquée.

De plus, vous constaterez peut-être que le fait de déplacer la logique d'insertion dans un SP vous permettra d'effectuer l'insertion en bloc que vous semblez faire sans effectuer d'appels répétés de la base de données.

Pour une réponse à votre question actuelle:

Violation de clé unique dans SQL Server - Est-il prudent de supposer l'erreur 2627?

2
Paul Michaels

Vous pouvez le faire aussi:

var result = DbCon.CheckForPrimaryKey(value).ToList();
if(result.Count() == 0)
       DbCon.InsertValue(value);
else
     // Do Nothing   
0
usefulBee