如何使用SqlBulkCopy并使用Glimpse跟踪批量插入

时间:2016-04-21 19:52:09

标签: c# sqlbulkcopy glimpse

在我们的应用程序中,我们使用SqlBulkCopy类来促进批量加载数据库。最近,我试图将Glimpse添加到我们的解决方案中,但代码失败并且无效的转换:

  

System.InvalidCastException:无法将类型为“Glimpse.Ado.AlternateType.GlimpseDbConnection”的对象强制转换为“System.Data.SqlClient.SqlConnection”

这是因为Glimpse ADO正在使用包裹SqlConnection来实现其魔力。很遗憾,SqlBulkCopy需要SqlConnection,因此我需要投放DbConnection

是否没有开箱即用的方式来分析批量插入?到目前为止,我遇到的唯一解决方法是:

(SqlConnection)((GlimpseDbConnection)dbConnection).InnerConnection

它很难看,因为它需要显式引用GlimpseDbConnection,并且可能还需要添加自定义时间线事件来获取一些跟踪。 是否没有解决这个问题的Glimpse插件?

1 个答案:

答案 0 :(得分:0)

我正在使用这种方法(使用EntityFramework' s DbContext),它似乎有效:

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