SqlBulkCopy 不尊重 NotifyAfter
SqlBulkCopy Not Respecting NotifyAfter
更新:所以这是一个愚蠢的错误,有点尴尬。我在下面正确设置值的地方有以下行:
copier.NotifyAfter = data.Rows.Count;
所以我覆盖了我自己的值,但没有用。
我将把这个 post 留在这里作为对其他人的提醒,有时,您只需要往下看几行就可以看到您正在覆盖您试图做的事情。希望有人会看这个并思考,"Ah ha! Yeah, got it. Oops."
如果比我拥有更多 mod 权力的人想要锁定它,或者认为它没有任何价值并想删除它,那对我有用。
与此同时,哎呀。 :)
我正在尝试说明(用于演示)SqlBulkCopy
中的批处理支持。为此,我有一个方法获取数据 table(其中包含 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 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);
}
}
更新:所以这是一个愚蠢的错误,有点尴尬。我在下面正确设置值的地方有以下行:
copier.NotifyAfter = data.Rows.Count;
所以我覆盖了我自己的值,但没有用。
我将把这个 post 留在这里作为对其他人的提醒,有时,您只需要往下看几行就可以看到您正在覆盖您试图做的事情。希望有人会看这个并思考,"Ah ha! Yeah, got it. Oops."
如果比我拥有更多 mod 权力的人想要锁定它,或者认为它没有任何价值并想删除它,那对我有用。
与此同时,哎呀。 :)
我正在尝试说明(用于演示)SqlBulkCopy
中的批处理支持。为此,我有一个方法获取数据 table(其中包含 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 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);
}
}