2014-01-07 4 views
0

트랜잭션에서 실행중인 여러 SQL 명령이 있습니다. SqlBulkCopy 및 SqlCommand 클래스를 사용하여 데이터베이스에서 변경 작업을 수행합니다. 처음에는 원시 데이터 (SqlBulkCopy 사용)로 한 테이블을 채운 다음 일종의 동기화 (원시 데이터에 따라 다른 테이블의 데이터 삽입, 삭제, 업데이트)를 수행하는 저장 프로 시저를 호출합니다.C# SqlTransaction.Commit 예외를 throw하지 않습니다

문제는 트랜잭션에서 이러한 작업을 호출 할 때 저장 프로 시저가 실패 (예 : 외래 키 보일링 등)하면 예외가 발생하지 않으며 오류가 발생했는지 여부를 알 수 없습니다. 여기

은 (시도/캐치로 둘러싸인) 코드 조각입니다 : 답변

SqlBulkCopy sqlUserGroupBulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction); 
    sqlUserGroupBulkCopy.DestinationTableName = USERGROUP_SOURCE_DATA_TABLE; 

    foreach (DataColumn column in UserGroupDataTable.Columns) 
     sqlUserGroupBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(column.ColumnName, column.ColumnName)); 

    sqlUserGroupBulkCopy.WriteToServer(UserGroupDataTable); 

    SqlCommand synchronizeCommand = new SqlCommand(); 
    synchronizeCommand.CommandType = CommandType.StoredProcedure; 
    synchronizeCommand.CommandText = SYNCHRONIZATION_SP; 
    synchronizeCommand.Parameters.AddWithValue("SourceName", "XXX"); 
    synchronizeCommand.Parameters.AddWithValue("Local", true); 
    synchronizeCommand.Connection = connection; 
    synchronizeCommand.Transaction = transaction; 
    synchronizeCommand.ExecuteNonQuery(); 

    transaction.Commit(); 

감사합니다, 미렉

추신 : 내 코드는 IIS 7.x의 컨테이너에서 .NET 3.5을 실행 .

+0

예를 들어'SourceName' 대신에'@ SourceName'을 매개 변수 이름으로 사용하면 안됩니까? 둘째,'ExecuteNonQuery'가 예외를 던지지 않습니까? 그것이 FK 위반이나 어떤 일이 일어날 지, 트랜잭션 커밋 중에 (적어도 기본 트랜잭션 설정을 사용하는 경우)가 아닙니다. 트랜잭션을 커밋 할 때 서버를 추방하는 등의 다른 문제가 발생할 경우에만 예외를 throw합니다. 트랜잭션 격리 수준이란 무엇입니까? – Luaan

+0

트랜잭션 내부에서 무언가가 실패 할 때 트랜잭션 커밋이 실패하지 않아야합니다 (문제를 해결했을 수도 있고 어쨌든 커밋하고 싶을 수도 있음). –

+0

동기화 코드 SP를 게시하십시오. 문제는 C# 코드가 아닌 가능성이 있습니다. 또한 관련된 테이블과 관계의 정의를 게시하십시오. –

답변

0

OK, 프로젝트를 다시 작성하고 IIS와 MS SQL Server를 다시 시작한 후 정상적으로 작업을 시작했습니다. 나는 생산에있어서 그러한 문제를 상당히 불만스럽고 걱정한다.

미레크

관련 문제