代码之家  ›  专栏  ›  技术社区  ›  Ari Roth

SqlBulkCopy不考虑NotifyAfter

  •  1
  • Ari Roth  · 技术社区  · 8 年前

    :所以这是一个愚蠢的错误,有点尴尬。我在下面的行中正确设置了值:

    copier.NotifyAfter = data.Rows.Count;
    

    我在这里留下这篇文章是为了提醒其他人,有时候,你只需要往下看几行就知道你在重写你试图做的事情。希望有人看到这个会想:“啊哈!明白了。哎呀。”

    如果有人比我拥有更多的mod权限想要锁定它,或者认为它没有增加任何价值并想删除它,这对我是有效的。

    同时,哎呀。:)


    SqlBulkCopy . 为此,我有一个方法,它接受一个数据表(其中有500000行),并设置两者 BatchSize 和 NotifyAfter SqlRowsCopied 事件。

    问题是,它不起作用。不管我做什么,我都不能打印出一条以上的信息。我知道 有效,因为如果我设置得很低,我可以看到行进入,但我不能让事件触发多次。有人知道我做错了什么吗?

    方法:

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

    输出

    第1批完成。

    最后,我可以在数据库中看到500000行。我只是不能让输出符合 财产。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Jebathon    8 年前

    复印机。通知后= 数据行数计数;

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