2016-04-21 16 views
2

In unserer App verwenden wir die Klasse SqlBulkCopy, um das Massenladen unserer Datenbank zu erleichtern. Vor kurzem habe ich versucht, Glimpse zu unserer Lösung hinzuzufügen, aber der Code nicht mit einer ungültigen Besetzung:So verwenden Sie SqlBulkCopy und verfolgen Masseneinsätze mit Glimpse

System.InvalidCastException: Kann nicht das Objekt des Typs ‚Glimpse.Ado.AlternateType.GlimpseDbConnection‘ werfen System Typen‘ .Data.SqlClient.SqlConnection‘

Dies liegt daran, Glimpse ADO ist ein verpacktes SqlConnection mit seiner Magie möglich zu machen. Leider benötigt SqlBulkCopy ein SqlConnection, also muss ich das DbConnection werfen.

Gibt es keine Out-of-the-Box-Möglichkeit, Bulk-Insertionen zu profilieren? Die einzige Behelfslösung stieß ich auf mit so weit ist:

(SqlConnection)((GlimpseDbConnection)dbConnection).InnerConnection 

Es ist hässlich, da es Referenzierung GlimpseDbConnection erfordert ausdrücklich und wahrscheinlich auch individual time-line es erfordert das Hinzufügen einige Ablaufverfolgung zu erhalten. Gibt es kein Glimpse-Add-on, das das löst?

+0

Es ist nicht eine, die ich kenne. – nikmd23

Antwort

0

Ich verwende diesen Ansatz (mit EntityFramework der DbContext) und es scheint zu funktionieren:

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); 
}