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