Ich habe eine Datentabelle, die ich zu BulkCopy zu einer Zieltabelle verwenden werde. Ich versuche, die primäre Schlüsselverletzung zu beheben. Anstatt eine temporäre Tabelle zu verwenden und dann mit der Produktion zu verbinden, versuche ich, die redundanten Zeilen aus der DataTable im Speicher zu löschen, bevor sie an die WriteToServer-Methode übergeben werden.
In meinem Code erstelle ich die Memory DataTable-Spalten im genau gleichen Format wie die Tabelle in der Datenbank in Bezug auf Spalten und Felder. Also mache ich keine Spaltenzuordnung. Mein PK-Eintrag ist eine GUID mit einer eindeutigen Wertbeschränkung und heißt PKID. Ich fülle die DataTable aus CSV-Dateien auf der Festplatte und dann die BulkCopy.
Meine Idee ist, die folgende Logik zu versuchen: Delete From MemoryDataTable, wo sich PKID befindet (SELECT PKID from SQLTable)
Hier ist mein 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
Danke das kann eine gute Option sein. Allerdings habe ich erreicht, was ich versucht habe :) Im Catch-Bereich habe ich alle PKs aus der Live-DB-Tabelle zu einem DataReader ausgewählt. Dann schlinge ich durch den Leser die Zeilen zurück. In jeder Schleife verwende ich die MemoryDataTable.rows.find-Methode, um zu überprüfen, ob die DataReader-Zeile in der MemoryDataTable existiert, wenn ja, lösche ich sie.