C# SqlBulkCopy不符合以下条件:
更新:所以这是一个愚蠢的错误,有点尴尬。我在下面的行中正确设置了值:C# SqlBulkCopy不符合以下条件:,c#,sqlbulkcopy,C#,Sqlbulkcopy,更新:所以这是一个愚蠢的错误,有点尴尬。我在下面的行中正确设置了值: copier.NotifyAfter = data.Rows.Count; 所以我重写了我自己的值,但它不起作用 我将把这篇文章留在这里,作为对其他人的一个提醒,有时候,你只需要往下看几行,就可以看到你正在覆盖你试图做的事情。希望有人看到这个会想,“啊哈!是的,明白了。哦。” 如果有人拥有比我更多的mod权限,想要锁定它,或者认为它没有增加任何价值,想要删除它,这对我来说是可行的 与此同时,哎呀。:) 我试图(作为演示)说
copier.NotifyAfter = data.Rows.Count;
所以我重写了我自己的值,但它不起作用
我将把这篇文章留在这里,作为对其他人的一个提醒,有时候,你只需要往下看几行,就可以看到你正在覆盖你试图做的事情。希望有人看到这个会想,“啊哈!是的,明白了。哦。”
如果有人拥有比我更多的mod权限,想要锁定它,或者认为它没有增加任何价值,想要删除它,这对我来说是可行的
与此同时,哎呀。:)
我试图(作为演示)说明
SqlBulkCopy
中的批处理支持。为此,我有一个方法,它获取一个数据表(其中有500000行),将BatchSize
和NotifyAfter
设置为100000,并在每次触发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);
}
}
输出
500000行,5批
第一批完成
按任意键继续
最后,我可以在数据库中看到500000行。我只是无法获得输出以尊重NotifyAfter
属性。删除
copier.NotifyAfter=data.Rows.Count
为什么在第一个NotifyAfter之后连续出现“copier.NotifyAfter=data.Rows.Count”?NotifyAfter的文档还包括调用“SqlRowsCopiedEventHandler”对象,并将函数作为参数。然后通知会调用该函数您。。。开玩笑。天哪,我是个白痴。我已经看了一个小时了,没有注意到第二个
NotifyAfter
。那就可以解释了。非常感谢你!Ok标记为答案
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);
}
}