bulkCopy.WriteToServer 후 결과를 반환하는 방법

c# sqlbulkcopy sql-server sql-server-2008

문제

허용 된 답변을 기반으로 업데이트 :

bool success = false;
using (var bulkCopy = new SqlBulkCopy(connection)) //using!
{
    connection.Open();

    //explicit isolation level is best-practice
    using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
    {
        bulkCopy.DestinationTableName = "table";
        bulkCopy.ColumnMappings...

        using (var dataReader = new ObjectDataReader<SomeObject>(paths))
        {            
            bulkCopy.WriteToServer(dataReader);
            success = true;
        }

        tran.Commit(); //commit, will not be called if exception escapes
    }
}
return success;

난 큰 삽입 BulkCopy 클래스를 사용하고 잘 작동합니다.
WriteToServer 실행하고 데이터를 데이터베이스에 저장 한 후
내가 모든 것을 저장해야하기 때문에 true/false 반환 할 수 있도록 모든 데이터가 성공적으로 저장 되었습니까?

    var bulkCopy = new SqlBulkCopy(connection);

    bulkCopy.DestinationTableName = "table";

    bulkCopy.ColumnMappings...

    using (var dataReader = new ObjectDataReader<SomeObject>(paths))
    {
        try
        {
        bulkCopy.WriteToServer(dataReader);
        }
        catch(Exception ex){ ... }    
}

수락 된 답변

WriteToServer 대한 호출이 예외없이 완료되면 모든 행이 저장되고 디스크에 저장됩니다. 이것은 SQL Server DML의 표준 의미 체계 일뿐입니다. 일괄 복사에는 특별한 것이 없습니다.

다른 모든 DML과 마찬가지로 SqlBulkCopy 도 모두 또는 아무것도 아닙니다. 그렇지 않은 배치 크기를 구성한 경우는 예외입니다.

using (var bulkCopy = new SqlBulkCopy(connection)) //using!
{
    connection.Open();

    //explicit isolation level is best-practice
    using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
    {
        bulkCopy.DestinationTableName = "table";
        bulkCopy.ColumnMappings...

        using (var dataReader = new ObjectDataReader<SomeObject>(paths))
        {
            //try
            //{
            bulkCopy.WriteToServer(dataReader, /*here you set some options*/);
            //}
            //catch(Exception ex){ ... } //you need no explicit try-catch here
        }

        tran.Commit(); //commit, will not be called if exception escapes
    }
}

베스트 프랙티스와 정렬 된 샘플 코드를 추가했습니다.


인기 답변

WriteToServer() 메서드에서 발생한 예외를 찾아서 잡는 것 이외에는 프로세스가 성공적으로 완료되었는지 여부를 직접 확인할 수있는 방법은 없습니다.

또 다른 방법은 데이터베이스의 레코드 수를 확인한 다음 프로세스가 완료된 후 레코드 수를 확인하는 것입니다. 차이는 삽입 된 숫자입니다. 이 값을 삽입 할 레코드 수와 비교하면 실패 또는 성공을 알 수 있습니다. 그러나 이것은 특히 다른 프로세스 삽입 / 삭제 레코드가있는 경우에 어리석은 증거는 아닙니다.

그러나 이러한 기술을 TransactionScope - http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx 와 함께 사용하면 필요한 것을 얻을 수 있습니다.

편집하다

기본적으로 각 삽입 작업은 일괄 처리됩니다. 특정 배치에서 작업이 실패하면 해당 배치는 롤백되며 앞에 삽입 된 배치는 롤백되지 않습니다.

그러나 내부 트랜잭션이 모든 행의 실패보다 대량 작업에 적용되는 경우 전체 결과 집합을 롤백 할 수 있습니다. 예를 들면;

using (SqlBulkCopy bulkCopy =
   new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity
                   | SqlBulkCopyOptions.UseInternalTransaction))
{
   bulkCopy.BatchSize = 10;
   bulkCopy.DestinationTableName = "dbo.BulkCopyDemoMatchingColumns";

   try
   {
      bulkCopy.WriteToServer(reader);
   }
   catch (Exception ex)
   {
      Console.WriteLine(ex.Message);
   }
   finally
   {
      bulkCopy.Close();
   }
}

위의 작업 중 하나라도 오류가 발생하면 전체 작업이 롤백됩니다. 자세한 내용은 http://msdn.microsoft.com/en-us/library/tchktcdk.aspx를 참조 하십시오 .



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