Come usare SqlBulkCopy e tracciare Bulk Inserts con Glimpse

c# glimpse sqlbulkcopy

Domanda

Nella nostra app utilizziamo la classe SqlBulkCopy per facilitare il caricamento in SqlBulkCopy del nostro database. Recentemente, ho provato ad aggiungere Glimpse alla nostra soluzione ma il codice fallisce con un cast non valido:

System.InvalidCastException: impossibile eseguire il cast dell'oggetto di tipo 'Glimpse.Ado.AlternateType.GlimpseDbConnection' per digitare 'System.Data.SqlClient.SqlConnection'

Questo perché Glimpse ADO sta utilizzando un SqlConnection avvolto per rendere possibile la sua magia. Sfortunatamente, SqlBulkCopy richiede un SqlConnection quindi devo eseguire il cast di DbConnection .

Non esiste un modo immediato per profilare gli inserimenti collettivi? L'unico work-around che ho trovato finora è:

(SqlConnection)((GlimpseDbConnection)dbConnection).InnerConnection

È brutto dal momento che richiede di fare riferimento a GlimpseDbConnection in modo esplicito e probabilmente richiede anche l'aggiunta di eventi della linea temporale personalizzati per ottenere una traccia. Non c'è nessun componente aggiuntivo di Glimpse che risolva questo problema?

Risposta popolare

Sto usando questo approccio (con DbContext di DbContext ) e sembra funzionare:

DbContext Db = /* ... */;

var glimpseDbConnection = Db.Database.Connection as GlimpseDbConnection;
var sqlConnection = glimpseDbConnection != null ? (SqlConnection)glimpseDbConnection.InnerConnection : (SqlConnection)Db.Database.Connection;

var glimpseDbTransaction = Db.Database.CurrentTransaction.UnderlyingTransaction as GlimpseDbTransaction;
var sqlTransaction = glimpseDbTransaction != null ? (SqlTransaction)glimpseDbTransaction.InnerTransaction : (SqlTransaction)Db.Database.CurrentTransaction.UnderlyingTransaction;

using (var bulkCopy = new SqlBulkCopy(sqlConnection, SqlBulkCopyOptions.Default, sqlTransaction))
{
    var dataTable = /* ... */;
    bulkCopy.BatchSize = 2000;
    bulkCopy.BulkCopyTimeout = TimeSpan.FromMinutes(5).Seconds;
    bulkCopy.DestinationTableName = /* ... */;
    bulkCopy.WriteToServer(dataTable);
}


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é