La classe SQL Server .NET SqlBulkCopy rimane in esecuzione dopo l'eccezione

.net bulkinsert exception-handling sqlbulkcopy sql-server

Domanda

Sto inserendo molti dati con un SqlBulkCopy. La fonte dei dati potrebbe avere alcune righe duplicate. Io il tavolo di destinazione ho un indice di unicità.

Quando viene visualizzata la prima riga duplicata, SqlBulkCopy genera un'eccezione e ripristina la transazione interna. Voglio ignorare l'eccezione e continuare a inserire. (SOLO se l'eccezione riguarda la riga duplicata).

Ci sono alcune domande su questo problema, ma sono tutte alla ricerca di righe duplicate di report, semplicemente non mi interessano.

Risposta accettata

Questo è uno dei compromessi con SqlBulkCopy: lo uso quando so di avere dati puliti. Se devi essere in grado di gestire bene gli errori in situazioni come questa in cui non hai dati puliti, allora altri approcci sono "migliori" (è comunque un compromesso per le prestazioni).

Seguendo la tua altra domanda, l'approccio di SqlDataAdapter ti darà questa abilità in quanto esiste una proprietà ContinueOnError che puoi impostare per consentire al processo di continuare in caso di errori come questo - molto utile. Uso questo approccio quando ho bisogno di gestire dati non-così-puliti / potenzialmente problematici da .NET. Ma come ho collegato in precedenza, vedrai un costo perfetto.

Se si desidera prestazioni assolute e per soddisfare i requisiti originali di tenuta separata, è necessario deduplicare i dati prima di caricarli nel DB. O utilizzare un approccio come TomTom suggerito


Risposta popolare

Risolvi il problema prima di inserire l'inserto di massa. L'inserto di massa è specificamente definito per non gestire cose del genere. Per questo mette SQL Server in una modalità di inserimento di massa che è più veloce ... ma ha dei limiti. Tutte le violazioni delle chiavi devono essere eseguite PRIMA dell'inserto.

Quello che vuoi fare è inserirlo in una tabella di staging (i doppi sono consentiti), quindi MERGE nella tabella principale (usando il comando MERGE).



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché