SqlBulkCopy는 NotifyAfter를 존중하지 않습니다.

c# sqlbulkcopy

문제

업데이트 : 그래서 이것은 벙어리 실수와 다소 embarassing. 값을 올바르게 설정하는 위치에 다음 줄이 있습니다.

copier.NotifyAfter = data.Rows.Count;

그래서 나는 내 자신의 가치를 덮어 쓰고 있었고 효과가 없었습니다.

이 게시물을 다른 사람들에게 알리기 위해 남겨두기로했습니다. 때로는 몇 줄을 낮춰서 자신이하려는 일을 덮어 쓰는 것을 볼 필요가 있습니다. 누군가가 이것을보고 "아 하! 예, 알겠습니다."라고 생각합니다.

나보다 강력한 능력을 가진 누군가가 이것을 잠 그거나 가치가 없다고 생각하고 그것을 제거하고 싶다고 생각하면 그것은 저에게 효과적입니다.

그동안, 죄송합니다. :)


나는 데모를 위해 SqlBulkCopy 에서 배치 지원을 설명하려고한다. 이렇게하려면 데이터 테이블 (500,000 행 포함)을 사용하고 BatchSizeNotifyAfter 를 모두 100,000으로 설정하고 SqlRowsCopied 이벤트가 발생할 때마다 인쇄하는 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 속성을 존중하도록 출력물을 가져올 수 없습니다.

수락 된 답변

풀다

복사기 .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);
    }
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.