更新:所以这是一个愚蠢的错误,有些尴尬。我在下面的行中正确设置了值:
copier.NotifyAfter = data.Rows.Count;
所以我覆盖了我自己的价值,但没有用。
我将把这个帖子留在这里,以提醒其他人,有时候,您只需要向后看几行,就可以覆盖正在尝试执行的操作。希望有人看着这个,然后想,“啊哈!是的,明白了。糟糕!”
如果某人拥有比我更多的修改能力,或者想要锁定它,或者认为它没有任何价值,并且想要删除它,那么这对我有用。
与此同时,哎呀。 :)
我正在尝试演示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
属性。
答案 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);
}
}