私は宛先テーブルへのBulkCopyに使用するdataTableを持っています。私は主キー違反を解決しようとしています。そのため、一時テーブルを使用して本番とマージする代わりに、WriteToServerメソッドに渡す前に、メモリ内のDataTableから冗長な行を削除しようとしています。
私のコードでは、列とフィールドに関してデータベースのテーブルと同じ正確なフォーマットでMemory DataTableカラムを作成します。だから私は列マッピングをしていません。私のPKレコードは、一意の値制約を持つGUIDであり、PKIDと呼ばれます。私は、ディスク上のCSVファイルからDataTableを埋め込み、BulkCopyを実行します。
私の考えは、次のロジックを実行しようとしています: Delete from MemoryDataTable PKIDが入っている場所(SQLTableのSELECT PKID)
ここに私のコードです:
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
ありがとう、それは良いオプションになることができます。しかし、私がやろうとしていたことを成し遂げました:) catchセクションでは、ライブDBテーブルのすべてのPKをDataReaderに選択しました。次に、読者が返す行をループします。各ループでは、MemoryDataTable.rows.findメソッドを使用して、MemoryDataTableにDataReader行が存在するかどうかを確認します(存在する場合は削除します)。