【问题标题】:Overpassing SqlBulkCopy - Violation of Primary Key超越 SqlBulkCopy - 违反主键
【发布时间】:2014-10-15 22:14:28
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: sql-server vb.net sqlbulkcopy


    【解决方案1】:

    从性能角度来看,最佳方法取决于重复的可能性。如果重复很少,您可以先尝试批量复制,然后在发生 PK 冲突时回退到单行条件插入或合并。

    我已经看到存储过程具有出色的性能,该存储过程采用 IEnumerable SqlDataRecord 类型的表值参数,该参数有条件地从 TVP 插入行。 TVP 方法在内部将数据批量插入到 tempdb 中,因此它的性能非常好。如果您在源批次中有重复项,您也可以通过插入表变量并将其用作条件插入或合并的源来删除 proc 中的重复项。 TVP 方法还可以让您增加批量大小并显着提高性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2012-07-15
      • 1970-01-01
      • 2015-06-25
      • 2021-04-11
      • 2016-08-24
      相关资源
      最近更新 更多