J'ai un dataTable que je vais utiliser pour BulkCopy dans une table de destination. J'essaie de résoudre une violation de clé primaire. Ainsi, au lieu d'utiliser une table temporaire puis de fusionner avec la production, j'essaie de supprimer les lignes redondantes du DataTable en mémoire avant de les transmettre à la méthode WriteToServer.
Dans mon code, je crée les colonnes Memory DataTable dans le même format exact que le tableau de la base de données en termes de colonnes et de champs. Donc, je ne fais pas de mappage de colonne. Mon enregistrement PK est un GUID ayant une contrainte de valeur unique et s'appelle PKID. Je remplis le DataTable à partir de fichiers CSV sur disque puis fais BulkCopy.
Mon idée est d'essayer de faire la logique suivante: Supprimer de MemoryDataTable où PKID est dans (SELECT PKID de SQLTable)
Voici mon code:
Try
Using sqlBulk As New SqlBulkCopy(LocalDBConnectionString, SqlBulkCopyOptions.TableLock)
sqlBulk.DestinationTableName = "DataRecords"
sqlBulk.BatchSize = 5000
sqlBulk.WriteToServer(MemoryDataTable)
sqlBulk.Close()
End Using
Catch ex As Exception
EventArgs.ErrorMessage = ex.Message
''''Catch Primary Key Violation Here''''
End Try
Merci cela peut être une bonne option. Cependant, j'ai accompli ce que j'essayais de faire :) Dans la section des captures, j'ai sélectionné tous les PK de la table de base de données dynamique dans un DataReader. Ensuite, je parcourais le lecteur avec les lignes retournées. Dans chaque boucle, j'utilise la méthode MemoryDataTable.rows.find pour vérifier si la ligne DataReader existe dans MemoryDataTable. Si oui, je la supprime.