超越SqlBulkCopy - 违反主键

时间:2014-10-15 22:14:28

标签: sql-server vb.net sqlbulkcopy

我尝试使用SqlBulkCopy以10个批量上传到数据库记录。某些数据已经存在于目标表中,因此,即使存在十分之一的记录,其余的也无法上传。有没有办法上传剩余的9条记录?

Try
    Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(conBSD)
       bulkCopy.DestinationTableName = "dbo.cheques2"
        ' Write from the source to the destination.
        bulkCopy.BulkCopyTimeout = 60
        bulkCopy.WriteToServer(dtToUpload)
        iSuccessInserted += 10
        dtToUpload.Clear()
        dtToUpload.Dispose()
        MsgBox("Current " & iCurrent.ToString & " -  " & " In table toUpload " )
   End Using

'Duplicate key, access violation when trying to insert record with same recordID

Catch ex As SqlException When ex.ErrorCode = -2146232060 
   MsgBox(ex.Message & " " & ex.ErrorCode)
   dtToUpload.Clear()
   dtToUpload.Dispose()
   Exit Try
Catch ex As Exception
   MsgBox(ex.Message)
End Try

1 个答案:

答案 0 :(得分:0)

从绩效角度看,最佳方法取决于重复的可能性。如果重复很少,您可以先尝试批量复制,然后在PK违规的情况下回退到单行条件插入或合并。

我见过一个存储过程的优秀性能,该存储过程采用IEnumerable SqlDataRecord类型的表值参数,该参数从TVP有条件地插入行。 TVP方法在内部批量将数据插入tempdb,因此它的性能非常好。如果源批处理中有重复项,则可以通过插入表变量并将其用作条件插入或合并的源来删除proc中的重复项。 TVP方法还允许您增加批量大小并显着提高性能。