bulkCopy.WriteToServer () non genera eccezioni quando non viene copiato alcun dato

c# sql sqlbulkcopy

Domanda

Sto cercando di copiare un DataTable in una tabella di destinazione su Sql Server. Io uso il seguente codice So che bulkCopy.WriteToServer() è una funzione atomica (tutto-o-niente). Ma quando nulla è stato copiato, mi piacerebbe sapere!

try
{
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.UseInternalTransaction))
    {
        bulkCopy.DestinationTableName = "MyDestinationTable";
        bulkCopy.WriteToServer(dt);
        convertSuccess = true;
    }
}
catch
{
    convertSuccess = false;
}

Ho visto che non è stato copiato nulla in "MyDestinationTable" ma non ero a conoscenza di ciò perché il mio flag convertSuccess è tornato true . C'è un modo per sapere se il bulkCopy ha fatto il suo lavoro?

Risposta accettata

È possibile specificare la proprietà NotifyAfter e quindi gestire l'evento SqlRowsCopied dopo x quantità di righe.

static void Main() {
    try {
        using(SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.UseInternalTransaction)) {
            //Event handling
            bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
            bulkCopy.NotifyAfter = 50; //Put your rowcount here

            bulkCopy.DestinationTableName = "MyDestinationTable";
            bulkCopy.WriteToServer(dt);
            convertSuccess = true;
        }
    } catch {
        convertSuccess = false;
    }
}


private static void OnSqlRowsCopied(object sender, SqlRowsCopiedEventArgs e) {
    Console.WriteLine("Copied {0} so far...", e.RowsCopied);
}


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é