如何使用 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 跟踪批量插入的主要内容,如果未能解决你的问题,请参考以下文章

Azure - SqlBulkCopy 引发超时过期异常

使用 SqlBulkCopy,如何将数据插入到非默认数据库架构中的表中?

使用 SqlBulkCopy 连接到 SQLite 数据库

SqlBulkCopy 的推荐批量大小是多少?

使用 SQLBulkCopy 插入/更新数据库

百万次插入:SqlBulkCopy 超时