【问题标题】:SqlBulkCopy Not Respecting NotifyAfterSqlBulkCopy 不尊重 NotifyAfter
【发布时间】:2018-08-29 20:40:02
【问题描述】:

更新:所以这是一个愚蠢的错误,有点尴尬。我在下面正确设置了值的地方有以下行:

copier.NotifyAfter = data.Rows.Count;

所以我覆盖了我自己的值,但它不起作用。

我将把这篇文章留在这里,以提醒其他人,有时,您只需向下看几行,就可以看到您正在覆盖您正在尝试执行的操作。希望有人看到这个并想,“啊哈!是的,明白了。哎呀。”

如果比我拥有更多 mod 能力的人想要锁定它,或者认为它没有增加价值并想要删除它,这对我有用。

与此同时,哎呀。 :)


我试图说明(作为演示)SqlBulkCopy 中的批处理支持。为此,我有一个方法,它获取一个数据表(其中包含 500,000 行),将 BatchSizeNotifyAfter 都设置为 100,000,并在每次触发 SqlRowsCopied 事件时打印。

问题是,它不起作用。无论我做什么,我只能打印一条消息。我知道BatchSize 有效,因为如果我将它设置得非常低,我可以看到行进来,但我不能让事件多次触发。有谁知道我做错了什么?

方法:

public void InsertInBatches(SqlConnection connection, DataTable data)
{
    int currentBatch = 1;

    Console.WriteLine($"{data.Rows.Count.ToString("N0")} rows, {data.Rows.Count / 100000} batches");
    using (var copier = new SqlBulkCopy(connection))
    {
        copier.NotifyAfter = 100000;
        copier.BatchSize = 100000;
        copier.SqlRowsCopied += (s, e) => Console.WriteLine($"Batch {currentBatch++} complete.");
        copier.DestinationTableName = "dbo.BulkInsertPerformance";
        MapBulkCopyColumns(copier, data);
        copier.NotifyAfter = data.Rows.Count;
        copier.WriteToServer(data);
    }
}

输出

500,000 行,5 个批次

第 1 批完成。

按任意键继续。

到最后,我可以在数据库中看到 500,000 行。我只是无法让输出尊重NotifyAfter 属性。

【问题讨论】:

  • 为什么在第一个NotifyAfter之后会有"copier.NotifyAfter = data.Rows.Count"?后者不会凌驾于前者之上吗?
  • NotifyAfter 的文档还涉及以函数作为参数调用“SqlRowsCopiedEventHandler”对象。然后通知将调用该函数
  • 你在……开玩笑。天哪,我是个白痴。我已经看了一个小时,没有注意到第二个NotifyAfter。这就解释了。非常感谢!
  • 好的标记为答案

标签: c# sqlbulkcopy


【解决方案1】:

删除

copier.NotifyAfter = data.Rows.Count;

public void InsertInBatches(SqlConnection connection, DataTable data)
{
    int currentBatch = 1;

    Console.WriteLine($"{data.Rows.Count.ToString("N0")} rows, {data.Rows.Count / 100000} batches");
    using (var copier = new SqlBulkCopy(connection))
    {
        copier.NotifyAfter = 100000;
        copier.BatchSize = 100000;
        copier.SqlRowsCopied += (s, e) => Console.WriteLine($"Batch {currentBatch++} complete.");
        copier.DestinationTableName = "dbo.BulkInsertPerformance";
        MapBulkCopyColumns(copier, data);
        copier.WriteToServer(data);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 2021-04-15
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多