SqlBulkCopy不尊重NotifyAfter

时间:2018-08-29 20:40:03

标签: c# sqlbulkcopy

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

copier.NotifyAfter = data.Rows.Count;

所以我覆盖了我自己的价值,但没有用。

我将把这个帖子留在这里,以提醒其他人,有时候,您只需要向后看几行,就可以覆盖正在尝试执行的操作。希望有人看着这个,然后想,“啊哈!是的,明白了。糟糕!”

如果某人拥有比我更多的修改能力,或者想要锁定它,或者认为它没有任何价值,并且想要删除它,那么这对我有用。

与此同时,哎呀。 :)


我正在尝试演示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属性。

1 个答案:

答案 0 :(得分:2)

删除

  

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