如何使用 SqlBulkCopy 并通过 Glimpse 跟踪批量插入
Posted
技术标签:
【中文标题】如何使用 SqlBulkCopy 并通过 Glimpse 跟踪批量插入【英文标题】:How to use SqlBulkCopy and track Bulk Inserts with Glimpse 【发布时间】:2016-08-15 05:20:20 【问题描述】:在我们的应用程序中,我们使用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】:我正在使用这种方法(使用 EntityFramework 的 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);
【讨论】:
以上是关于如何使用 SqlBulkCopy 并通过 Glimpse 跟踪批量插入的主要内容,如果未能解决你的问题,请参考以下文章