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을 실행 .
예를 들어'SourceName' 대신에'@ SourceName'을 매개 변수 이름으로 사용하면 안됩니까? 둘째,'ExecuteNonQuery'가 예외를 던지지 않습니까? 그것이 FK 위반이나 어떤 일이 일어날 지, 트랜잭션 커밋 중에 (적어도 기본 트랜잭션 설정을 사용하는 경우)가 아닙니다. 트랜잭션을 커밋 할 때 서버를 추방하는 등의 다른 문제가 발생할 경우에만 예외를 throw합니다. 트랜잭션 격리 수준이란 무엇입니까? – Luaan
트랜잭션 내부에서 무언가가 실패 할 때 트랜잭션 커밋이 실패하지 않아야합니다 (문제를 해결했을 수도 있고 어쨌든 커밋하고 싶을 수도 있음). –
동기화 코드 SP를 게시하십시오. 문제는 C# 코드가 아닌 가능성이 있습니다. 또한 관련된 테이블과 관계의 정의를 게시하십시오. –