La clase SQL Server .NET SqlBulkCopy sigue ejecutándose después de la excepción

.net bulkinsert exception-handling sqlbulkcopy sql-server

Pregunta

Estoy insertando gran cantidad de datos con un SqlBulkCopy. La fuente de los datos puede tener algunas filas duplicadas. En la tabla de destino tengo un índice de singularidad.

Cuando aparece la primera fila duplicada, SqlBulkCopy lanza una excepción y revierte la transacción interna. Quiero que ignore la excepción y siga insertando. (SOLO si la excepción es para la fila duplicada).

Hay algunas preguntas sobre este problema, pero todas buscan filas duplicadas de informes, simplemente no me interesan.

Respuesta aceptada

Esta es una de las compensaciones con SqlBulkCopy: la uso cuando sé que tengo datos limpios. Si necesita poder lidiar con los errores muy bien en situaciones como esta donde no tiene datos limpios, entonces otros enfoques son "mejores" (aunque se trata de un compromiso para el rendimiento).

Siguiendo con su otra pregunta, el enfoque SqlDataAdapter le brindaría esta capacidad, ya que existe una propiedad ContinueOnError que puede establecer que permitirá que el proceso continúe en caso de errores como este: muy útil. Utilizo este enfoque cuando necesito manejar datos no tan limpios / potencialmente problemáticos de .NET. Pero como he vinculado anteriormente, verá un costo de rendimiento.

Si desea un rendimiento absoluto, y para cumplir con los requisitos originales de mantenerlos separados, debe duplicar los datos antes de cargarlos en la base de datos. O utilice un enfoque como TomTom sugirió


Respuesta popular

Solucione el problema antes de realizar la inserción masiva. La inserción masiva se define específicamente para no manejar cosas como esta. Para eso pone a SQL Server en un modo de inserción masiva que es más rápido ... pero tiene limitaciones. Todas las violaciones clave deben ser manejadas ANTES de la inserción.

Lo que quiere hacer es insertarlo en una tabla de preparación (se permiten dobles), luego COMBINAR en la tabla principal (usando el comando MERGE).



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué