【发布时间】:2018-08-29 20:40:02
【问题描述】:
更新:所以这是一个愚蠢的错误,有点尴尬。我在下面正确设置了值的地方有以下行:
copier.NotifyAfter = data.Rows.Count;
所以我覆盖了我自己的值,但它不起作用。
我将把这篇文章留在这里,以提醒其他人,有时,您只需向下看几行,就可以看到您正在覆盖您正在尝试执行的操作。希望有人看到这个并想,“啊哈!是的,明白了。哎呀。”
如果比我拥有更多 mod 能力的人想要锁定它,或者认为它没有增加价值并想要删除它,这对我有用。
与此同时,哎呀。 :)
我试图说明(作为演示)SqlBulkCopy 中的批处理支持。为此,我有一个方法,它获取一个数据表(其中包含 500,000 行),将 BatchSize 和 NotifyAfter 都设置为 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