SQLBulkCopy ne copie pas les clés primaires

c# sqlbulkcopy sql-server

Question

Quel est le meilleur moyen de traiter les erreurs de violation de clé primaire lors de l'utilisation de SQLBulkCopy

Violation of PRIMARY KEY constraint 'email_k__'. Cannot insert duplicate key in object  'lntmuser.email'.

(ie si la ligne existe déjà dans la table de destination)?

Existe-t-il un moyen de ne pas insérer de lignes en double ou faudrait-il vérifier et traiter cela à l’avance?

Voici le code que j'utilise actuellement:

  var conPro = tx_ProConStr.Text;
  var conArc = tx_ArcConStr.Text;

  var con = new SqlConnection {ConnectionString = conPro};
  var cmd = new SqlCommand("SELECT * FROM dbo.email", con);
  con.Open();

  var rdr = cmd.ExecuteReader(); 
  var sbc = new SqlBulkCopy(conArc) {DestinationTableName = "dbo.email"};

  sbc.WriteToServer(rdr);

  sbc.Close();
  rdr.Close();
  con.Close();

Réponse acceptée

Je finis généralement par effectuer une opération de copie en bloc sur une table temporaire, puis je copie les données de celle-ci vers la table cible à l'aide de SQL normal. Cela me permet d'effectuer des «mises à jour groupées», ainsi que de prendre en charge des situations spéciales comme celle-ci (bien que je n'ai pas rencontré ce besoin spécifique).

Il y a un impact négatif sur les performances par rapport à la copie en bloc directe, mais c'est toujours beaucoup plus rapide que d'effectuer des INSERT.


Réponse populaire

Vous pouvez ajuster la requête source pour exclure les doublons. Par exemple:

select distinct * from dbo.email

Ou filtrer le premier col1 par pkcol :

select  *
from    (
        select  row_number() over (parition by pkcol order by col1) as rn
        from    dbo.email
        ) as SubQueryAlias
where   rn = 1


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi