2010-03-11 2 views
4

Linq에서 SQL로 SQL Server 2005를 실행하고 Windows Server 2003에서 SQL Server 2005를 실행합니다. XP SP3에서 VS 2008을 로컬로 실행하고 있습니다.TransactionScope는 일부 장소에서 작동하며 다른 곳에서는 작동하지 않습니다.

트랜잭션에서 삽입, 업데이트 및 삭제를 래핑 할 수 있어야합니다. using(var trans = new TransactionScope()) { ...; trans.Complete(); }으로 코드 블록을 래핑하여 처음 시도한 경우 원격 트랜잭션을 위해 네트워크 액세스를 활성화해야한다는 적절한 예외가 발생했습니다. We did so 그리고 우리가 예상했던대로 일이 시작되었습니다.

오늘로 금일 전달하십시오. 우리 애플 리케이션에는 TransactionScope 처리를받은 부분이 조금 있습니다.

여기 Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool. http://img101.imageshack.us/img101/5480/msdtcnetworkaccesserror.jpg

예외를 발생시키는 코드입니다 : 거래는 우리의 코드베이스의 다른 모든 부분에서 제대로 작동하지만, 우리는이 거의 사용되지 조각은 이전과 동일 "네트워크 액세스"예외를 던지고 오늘 발견

 using (TransactionScope trans = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue)) 
     { 
      using (var dc = new ChargeXferDataContext()) 
      { 
       //create 'Line' object and set initial values 
       Line line = new Line(); 
       line.Unit_Num = UnitId; 
       line.SubmittedBy = Viewer.Alias(); 
       line.LineSubmittedOn = DateTime.Now; 

       //get codes to move from checked rows 
       //iterate rows in current gridview 
       foreach (GridViewRow row in gv.Rows) 
       { 
        //if checked, insert move order 
        HtmlInputCheckBox cb = (HtmlInputCheckBox)row.FindControl("RowLevelCheckBox"); 
        if (cb.Checked) 
        { 

         //1st: get required values 
         int id = Convert.ToInt32(((TextBox)row.FindControl("fldCodeId")).Text); 
         int newId = Convert.ToInt32(((DropDownList)row.FindControl("ddlNewId")).SelectedValue); 
         char newPOA = Convert.ToChar(((DropDownList)row.FindControl("ddlPOA")).SelectedValue); 

         //2nd: get current diag code from old patient 
         //######## Exception happens here... 
         DiagCode code = dc.DiagCodes.SingleOrDefault(c => c.Id == id); 
         //######## 

         //3rd: add code to emenline object 
         addCode(line, code, newId, newPOA); 

        } 
       } 
       dc.SubmitChanges(); 
       trans.Complete(); 
      } 
     }      

제안 사항이 있으면 알려 주시면 감사하겠습니다. 내가 더 설명 할 수 있으면 알려줘. 미리 감사드립니다 !!

+0

'addCode' 메소드는 무엇을합니까? –

+0

line 객체에 code, newId 및 newPOA를 추가합니다. 위 라인의 linq select 때문에 addCode()를 만들지 않습니다. –

+0

빨대를 쥐고 ​​있지만 DiagCodes에 대해 특별한 점이 있습니까? 다른 데이터베이스에 링크 하시겠습니까? 재미있는 일을하는 저장된 proc? 방아쇠? 또한 DataContext를 생성하기 위해 팩토리를 사용하는 패턴이 좋기 때문에 모두 응용 프로그램의 한 위치에서 생성됩니다. 그러나 일반적으로, 나는 TransactionScope가 너무 색다른 것으로 나타났습니다. 다음 번에는 앰비언트 변환이 필요합니다 (현재 사용중인 앱에서 곧 제공됨). 직접 구현할 것입니다. 예측할 수없는 MSDTC 종속성이 없으며 SQL Server뿐만 아니라 Oracle을 지원해야합니다. –

답변

1

나는 이것에 대한 해결책을 찾지 못했습니다. 삶과 함께 움직였다.

-1

오류가이 모든 것을 말합니다. 데이터베이스 서버에서 네트워크 액세스를 위해 Distributed Transaction Coordinator를 사용하도록 설정합니다.

+0

명시된 바와 같이, 이것은 완료되었으며 트랜잭션은 코드의 다른 부분에서 정상적으로 작동합니다. –

+0

@Byron Sommardahl, 코드의 다른 부분에서 작동한다고합니까? 그 장소에서 그 linq2sql datacontext와 함께 작동합니까? datacontext를 new'ing 할 때 connectionstring을 사용하지 않는 이유는 무엇입니까? 설정 파일에 올바른 연결 문자열이 들어 있고 해당 컴퓨터에서 DTC가 사용 설정되어 있는지 확인하십시오. 데이터베이스 서버에 방화벽이 있습니까? –

+0

하나의 DataContext로 모두를 제어합니다. 전체 응용 프로그램의 web.config에 하나의 연결 문자열. 동일한 DataContext는 코드의 다른 모든 곳에서 작동합니다. 문제는 데이터베이스가 아닙니다. 처음에는 문제가 아니었지만 지금은 해결되었습니다. –

관련 문제