2009-10-09 11 views
3

J'essaie d'utiliser SqlBulkCopy pour insérer de nouvelles lignes dans ma table DB en remplissant manuellement un DataTable w/dans mon application.SqlBulkCopy dans la table avec la clé primaire composite

Cela fonctionne bien pour toutes les tables sauf la table qui a une clé primaire composite constitué de 3 colonnes. Chaque fois que j'essaie de SqlBulkCopy quoi que ce soit dans cette table, je reçois l'erreur suivante:

Violation of PRIMARY KEY constraint 'PK_MYCOMPOSITEKEY'. Cannot insert duplicate key in object 'dbo.MyTable'. 
The statement has been terminated. 

Est-ce même possible?

J'ai essayé d'installer mes clés primaires de DataTable avec les éléments suivants:

dt.PrimaryKey = new[] {dt.Columns["PKcolumn1"], dt.Columns["PKcolumn2"], dt.Columns["PKcolumn3"]}; 

mais encore une fois, pas de chance.

Répondre

1

Le problème que vous avez est avec les données.

Dans le fichier d'entrée il y a une ou les deux

une ligne qui a les mêmes données dans les colonnes e pk que vous avez déjà dans la table

ou

Le fichier a à deux lignes au moins avec les mêmes valeurs que les colonnes pk

+0

C'est ce que je pensais aussi. Cependant, j'ai limité l'insertion à une seule ligne de valeurs que je ** sais ** ne sont pas encore dans la table de base de données. – kamens

+0

La base de données pense qu'ils sont - quelles sont les valeurs? – Mark

+0

Vous et Majkara avez raison. J'utilise Linq-to-SQL, et une dépendance de clé étrangère a été parcourue pendant DB.SubmitChanges() qui a inséré ces lignes étrangères devant le SqlBulkCopy dans mon chemin d'exécution ... même si je n'avais pas explicitement ajouté les lignes se. – kamens

1

Insertion en bloc dans une table de transfert. Nettoyer les enregistrements en double. Ensuite, faites un insert en utilisant SQL direct. Lorsque vous écrivez le code d'insertion, assurez-vous de le limiter aux enregistrements de la table de transfert qui ne se trouvent pas dans la table prod.

1

Vous devriez vérifier vos données de masse pour les copies avant que vous ne rencontriez la base de données, le problème pourrait également s'y trouver (pas seulement en conflit avec une contrainte existante, ou enregistrer en DB). Cela fonctionne et il est généralement correct de le signaler. Néanmoins, l'ensemble du show de DataSet ou même DataReaders est un exercice désordonné dans les mappings, un mauvais design sans typage, beaucoup de transformations inutiles, des allocations, des valeurs basées sur object [], et tout devient désordre. (quelque chose que seule MS pourrait concevoir et continuer à concevoir). D'autre part, les interfaces bulk OLEDB natives sont beaucoup plus propres.

Questions connexes