让SqlBulkCopy在MiniProfiler中显示为sql

6
我正在使用MiniProfiler来分析我的SQL命令。
现在我遇到的一个问题是,linq生成了重复的INSERT语句。
我将它们转换为了一个SqlBulkCopy命令,但现在它似乎没有在MiniProfiler的sql视图中记录下来。
一个SqlBulkCopy是否有关联的命令字符串?
如何让批量拷贝出现在sql命令列表中?
至少在“%sql”部分计数是可能的吗?
我知道我可以使用MiniProfiler.Current.Step("Doing Bulk Copy"),但那不会计算为SQL,并且不会显示任何细节的清单。
以下是当前代码:
public static void BulkInsertAll<T>(this DataContext dc, IEnumerable<T> entities)
{
    var conn = (dc.Connection as ProfiledDbConnection).InnerConnection as SqlConnection;
    conn.Open();

    Type t = typeof(T);

    var tableAttribute = (TableAttribute)t.GetCustomAttributes(
        typeof(TableAttribute), false).Single();
    var bulkCopy = new SqlBulkCopy(conn)
    {
        DestinationTableName = tableAttribute.Name
    };

    //....

    bulkCopy.WriteToServer(table);
}

数据被发送为特殊的TDS数据包,但我不知道BULK INSERT是否是使用SQL启动的。它在SQL Profiler中显示为SQL,但可能是假的。 - usr
2
我正在开发MiniProfiler 3.0,它增加了一个更通用的CustomTiming类,允许您对“批量复制”进行性能分析,并以与“sql”相同的方式在UI中显示。一旦发布,我会提供一个示例。 - Jarrod Dixon
@JarrodDixon:太好了!除了6-8周之外,有没有时间表呢? :) - George Duckett
这个周末,我希望...今天开始在内部进行测试。 - Jarrod Dixon
@JarrodDixon:抱歉打扰了,这方面有什么消息吗?我看到它在Git上得到了更新,但在NuGet上似乎没有更新。 - George Duckett
显示剩余3条评论
1个回答

5
您可以使用CustomTimings来对其进行性能剖析。它们已经包含在新的v3版本中,现在可以从nuget获取
您可以在示例项目中看到如何使用CustomTiming,用于记录http和redis事件。
以下是如何与SqlBulkCopy一起使用的示例:
string sql = GetBulkCopySql(); // what should show up for the SqlBulkCopy event?
using (MiniProfiler.Current.CustomTiming("SqlBulkCopy", sql)) 
{
  RunSqlBulkCopy(); // run the actual SqlBulkCopy operation
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接