Domande su SQl BulkCopy

c# sqlbulkcopy sql-server sql-server-2005

Domanda

Mi chiedo come può fare un inserto di massa e una copia bulk allo stesso tempo? Ho 2 tabelle che dovrebbero essere influenzate dalla copia di massa in quanto entrambe dipendono l'una dall'altra.

Quindi voglio che, se durante l'inserimento della tabella 1 un record muore, viene eseguito il rollback e la tabella 2 non viene mai aggiornata. Anche se la tabella 1 si inserisce bene e la tabella 2 ha esito negativo, la tabella 1 viene sottoposta a rollback.

Questo può essere fatto con la copia di massa?

modificare

Avrei dovuto accennare che sto facendo l'inserto in serie anche se C #.

Sembra un po 'come questo, ma questo è un esempio in cui ho lavorato. Quindi non sono sicuro di doverlo modificare per essere una stored procedure (non sono sicuro di come sembrerebbe e di come sarebbe il codice C #)

private static void BatchBulkCopy()
{
    // Get the DataTable 
    DataTable dtInsertRows = GetDataTable();

    using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))
    {
        sbc.DestinationTableName = "TBL_TEST_TEST";

        // Number of records to be processed in one go
        sbc.BatchSize = 500000;

        // Map the Source Column from DataTabel to the Destination Columns in SQL Server 2005 Person Table
        // sbc.ColumnMappings.Add("ID", "ID");
        sbc.ColumnMappings.Add("NAME", "NAME");

        // Number of records after which client has to be notified about its status
        sbc.NotifyAfter = dtInsertRows.Rows.Count;

        // Event that gets fired when NotifyAfter number of records are processed.
        sbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(sbc_SqlRowsCopied);

        // Finally write to server
        sbc.WriteToServer(dtInsertRows);
        sbc.Close();
    }

}

Risposta accettata

Mi chiedo come può fare un inserto di massa e una copia bulk allo stesso tempo? Ho 2 tabelle che dovrebbero essere influenzate dalla copia di massa in quanto entrambe dipendono l'una dall'altra. Quindi voglio che, se durante l'inserimento della tabella 1 un record muore, viene eseguito il rollback e la tabella 2 non viene mai aggiornata. Anche se la tabella 1 si inserisce bene e la tabella 2 ha esito negativo, la tabella 1 viene sottoposta a rollback. Questo può essere fatto con la copia di massa?

No, l'intero punto di SqlBulkCopy è quello di ottenere i dati nel tuo database il più velocemente possibile. Scaricherà i dati in un'unica tabella.

Il caso d'uso normale sarà quello di ispezionare la tabella una volta che è stata importata e iniziare a "suddividere" quei dati e memorizzarli in qualsiasi posto necessario, in genere attraverso una stored procedure (poiché i dati sono già sul server, e si desidera distribuirlo ad altre tabelle: non si desidera riportare tutti i dati al client, controllarli e quindi inviarli nuovamente al server ancora una volta).

SqlBulkCopy cattura solo un mucchio di dati e li fa cadere in una tabella - molto velocemente così. Non può suddividere i dati in più tabelle in base a criteri o condizioni.


Risposta popolare

Puoi eseguire inserimenti collettivi all'interno di una transazione definita dall'utente, quindi fai qualcosa di simile a questo:

BEGIN TRANSACTION MyDataLoad
BEGIN TRY

BULK INSERT ...

BULK INSERT ...

COMMIT TRANSACTJION MyDataLoad
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH

Tuttavia, ci possono essere altri modi per realizzare ciò che vuoi. Le tabelle sono vuote prima di essere inserite in massa? Quando dici che le tabelle dipendono l'una dall'altra, vuoi dire che ci sono vincoli di chiave esterna che vuoi applicare?



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é