2009-12-20 5 views
1

아래 코드를 사용하여 첫 번째 테이블 (info2.Id = info.Id;)에서 사용 된 ID로 두 번째 테이블 (Info2)을 업데이트합니다. . 두 번째 저장이 수행되면 (info2.Save()) 오류가 발생합니다. "이미 닫혀 있어야하는이 명령과 연결된 열린 DataReader가 이미 있습니다.". 누구나 내가 잘못하고있는 것을 볼 수 있습니까? 잘못된 방법 라운드 TransactionScope에와 SharedDbConnectionScope있어 같은SubSonic 트랜잭션 - 첫 번째 테이블의 반환 ID를 사용하여 두 번째 테이블에 삽입

음속 버전 3.0.0.3 및 SQL Server 2005

감사

   using (SharedDbConnectionScope sharedConnectionScope = new SharedDbConnectionScope()) 
       { 
        using (TransactionScope ts = new TransactionScope()) 
        { 
         Info info = new Info(); 
         info.Desc = "Some information"; 
         info.Save(); 

         Info2 info2 = new Info2(); 
         info2.Id = info.Id; 
         info2.Desc = "More information"; 
         info2.Save(); 

         ts.Complete(); 
        } 
       } 

답변

0

이 보이는 시도 :

using (TransactionScope ts = new TransactionScope()) 
{ 
    using (SharedDbConnectionScope sharedConnectionScope = new SharedDbConnectionScope()) 
    { 
    Info info = new Info(); 
    info.Desc = "Some information"; 
    info.Save(); 

    Info2 info2 = new Info2(); 
    info2.Id = info.Id; 
    info2.Desc = "More information"; 
    info2.Save(); 

    ts.Complete(); 
    } 
} 
+0

나는이 실수가 아음속의 사용자를 영원히 따를 것이라고 생각합니다. 그것은 오랫동안 문서에서 잘못되었습니다. 올바른 순서를 외우려면 Connection이 트랜잭션에 대해 알아야하므로 트랜잭션이 먼저 처리된다는 것을 기억합니다. TransactionScope 줄에서 대괄호를 닫습니다. 중첩 된 절을 사용하여 더 쉽게 읽을 수있게합니다. –

0

내가 코멘트에 기록한대로,이 작업을 수행 할 수있는 유일한 방법은 먼저 TransactionScope를 사용하고 SharedDbConnectionScope (감사합니다 Adam)를 사용하고 MultipleA ctiveResultSets = True; (SQL Server 2005)를 연결 문자열에 추가합니다.

아무도 더 좋은 해결책이나 다른 제안이 있습니까? 감사합니다.

 try 
     { 
      using (TransactionScope ts = new TransactionScope()) 
      { 
       using (SharedDbConnectionScope scs = new SharedDbConnectionScope()) 
       { 
        Info info = new Info(); 
        info.Desc = "Some information"; 
        info.Save(); 

        //Test for rollback 
        //throw new Exception("STOP"); 

        Info2 info2 = new Info2(); 
        info2.Id = info.Id; 
        info2.Desc = "More information"; 
        info2.Save(); 

        ts.Complete(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
관련 문제