SqlBulkCopy 不尊重 NotifyAfter

SqlBulkCopy Not Respecting NotifyAfter

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

copier.NotifyAfter = data.Rows.Count;

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

我将把这个 post 留在这里作为对其他人的提醒,有时,您只需要往下看几行就可以看到您正在覆盖您试图做的事情。希望有人会看这个并思考,"Ah ha! Yeah, got it. Oops."

如果比我拥有更多 mod 权力的人想要锁定它,或者认为它没有任何价值并想删除它,那对我有用。

与此同时,哎呀。 :)


我正在尝试说明(用于演示)SqlBulkCopy 中的批处理支持。为此,我有一个方法获取数据 table(其中包含 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 rows, 5 batches

Batch 1 complete.

Press any key to continue.

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

移除

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