SQLBulkCopy carica i dati in caso di errore?

c# sql sqlbulkcopy sql-server

Domanda

Sto facendo una copia di massa di dati sql da un foglio di calcolo excel a una tabella temporanea e quindi da una tabella temporanea a un database di produzione.

La mia domanda è questa, se per qualsiasi motivo il caricamento fallisce o sulla tabella temporanea o sul database di produzione, la transazione viene sottoposta a rollback e nessun dato viene importato o modificato dati esistenti?

Risposta accettata

Per impostazione predefinita, SqlBulkCopy tornerà all'ultimo batch completato. Se hai un valore BatchSize pari a 0 (il valore predefinito), eseguirà tutto in un singolo batch ma potresti ottenere un timeout se il batch impiega troppo tempo per essere caricato (predefinito 30 secondi).

Un'altra opzione è racchiudere l'intera cosa in una transazione esterna e passarla al costruttore . Ciò ripristinerà l'intera operazione di inserimento su un errore anziché solo sull'ultimo batch, ciò consente di utilizzare batch più piccoli, ma l'intero inserto deve sempre essere una singola transazione. Ciò consente anche di utilizzare la stessa transazione per lo spostamento dei dati dalla tabella temporanea di staging nei dati in tempo reale.

Ecco uno snippit preso da MSDN

using (SqlConnection destinationConnection = new SqlConnection(connectionString))
{
    destinationConnection.Open();

    using (SqlTransaction transaction = destinationConnection.BeginTransaction())
    {
        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(
                   destinationConnection, SqlBulkCopyOptions.KeepIdentity,
                   transaction))
        {
            bulkCopy.BatchSize = 10;
            bulkCopy.DestinationTableName = "dbo.BulkCopyDemoMatchingColumns";

            // Write from the source to the destination. 
            // This should fail with a duplicate key error. 
            try
            {
                bulkCopy.WriteToServer(reader);
                transaction.Commit();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                transaction.Rollback();
            }
            finally
            {
                reader.Close();
            }
        }
    }
}


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