Superamento di SqlBulkCopy - Violazione della chiave primaria

sqlbulkcopy sql-server vb.net

Domanda

Sto provando a caricare su un database record in gruppi di 10 utilizzando SqlBulkCopy. Alcuni dati sono già presenti nella tabella di destinazione, quindi, anche se esiste una registrazione su dieci, il resto non viene caricato. C'è un modo per caricare i restanti 9 record?

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

Risposta accettata

L'approccio migliore dal punto di vista delle prestazioni dipende dalla probabilità di un duplicato. Se i duplicati sono rari, puoi provare prima la copia bulk e poi ricorrere agli inserimenti condizionali a riga singola o unire in caso di violazione di PK.

Ho visto prestazioni eccellenti con una stored procedure che accetta un parametro con valori di tabella di tipo IEnumerable SqlDataRecord che inserisce le righe in modo condizionale da TVP. Il metodo TVP internamente alla rinfusa inserisce i dati in tempdb in modo che funzioni molto bene. Se si dispone di duplicati in un batch di origine, è possibile deselezionare quelli all'interno del processo anche inserendo una variabile di tabella e utilizzandola come origine per l'inserimento o l'unione condizionale. Il metodo TVP ti consentirà inoltre di aumentare le dimensioni del batch e migliorare significativamente le prestazioni.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow