WCF

1

에서 하나의 트랜잭션에 여러 개의 저장 프로 시저를 실행이 여기에 내 첫 번째 게시물 .. 내가 데이터 액세스 레이어 역할을하는 WCF 서비스를 제공 MVC3에서 프로그램을 쓰고 있어요WCF

이다. 내 DAL에서 일종의 '일괄 처리'삽입 및 업데이트를해야합니다. 예를 들어 주문과 관련하여 특히 그렇습니다. 하나의 주문에 여러 항목이 있으며 여러 가지 결제 수단 등이있을 수 있습니다. 새 주문을 삽입 할 때 해당 주문과 관련된 모든 항목을 삽입해야합니다.

따라서 내가 찾고있는 것은 더 나은 방법과 가능한 여러 가지 저장 프로 시저를 실행할 수있는 방법입니다. 예를 들어, 순서 등의 항목을 삽입 할 다른 ..

테이블 OrderItem 제 3 테이블에 함께 연결되어있다가있을 것이다, Order_Items 전화 (FK)의 order_id (FK) item_id, qty,,..

나는 명령 텍스트를 변경하고 트랜잭션과 함께 비 쿼리를 실행하여 여러 명령을 실행할 수 있음을 알고 있지만 텍스트 명령을 하드 코딩하는 대신 저장 프로 시저를 실행하려고합니다. 항목이, 트랜잭션 (transaction)

foreach (string s in insert_items) 
{ 
    cmd.CommandText = s; 
    cmd.ExecuteNonQuery(); 
} 

이 모든 말을 한 다음 .. 커밋 않지만 나는이 같은 깨끗한 방법입니다 생각하지 않습니다 루프 다음 ​​

cmd.CommandText = 'exec sp_insert_order @order_number @order_date ...' 
cmd.ExecuteNonQuery(); 

와 같은 만드는 명령 텍스트 뭔가 일을하고 .. 누군가가 그들의 O를 공유 할 수 있습니까? 날개.

+2

에 오신 것을 환영합니다. 코드, XML 또는 데이터 샘플을 게시하는 경우 ** 텍스트 편집기에서 해당 행을 강조 표시하고 편집기 툴바의 "코드 샘플"버튼 ('{}) '을 클릭하십시오. 형식 및 구문을 강조 표시하십시오! –

답변

4

텍스트로 모든 작업을 둘러싸 당신의 방법에 속성을 사용할 수 있습니다 -이 방법을 사용하는 것이 좋습니다 :

// define your stored procedure name, and the type 
cmd.CommandText = 'dbo.sp_insert_order'; 
cmd.CommandType = CommandType.StoredProcedure; 

// define and fill your parameters 
cmd.Parameters.Add("@order_number", SqlDbType.Int).Value = order_nr; 
cmd.Parameters.Add("@order_date", SqlDbType.DateTime).Value = ......; 

cmd.ExecuteNonQuery(); 

기본적으로, 당신은 당신이 전화 할 각 저장 프로 시저에 대해이 작업을 수행해야 할 것, 그리고 당신은 아무 문제없이 단일 트랜잭션에서 사람들의 모든 포장 수 :

using(SqlConnection connection = new SqlConnection("your-connection-string-here")) 
{ 
    SqlTransaction transaction = connection.BeginTransaction(); 

    try 
    { 
     // call all stored procuedures here - remember to assign the 
     // transaction to the SqlCommand!! 
     .... 

     transaction.Commit(); 
    } 
    catch(Exception exc) 
    { 
     transaction.Rollback(); 
    }   
} 
+0

답장을 보내 주셔서 감사합니다. 실제로는 현재 사용하고있는 접근법입니다. 명령 목록을 보내고 있습니다. 그러나 실행 명령을 반복 할 때 첫 번째 ExecuteNonQuery()에서 곧바로 실행됩니다. 커밋을 반복하고 루프를 계속하지 않았습니다. 코드의 일부를 변경하고 루프의 모든 명령에 대해 새로운 인스턴스를 작성하여 작동 시켰습니다. 첫 번째 쿼리를 실행 한 후 루프를 종료했다는 것을 혼란 스러웠다. 그래서이 방법이 어떤 이유에서든 작동하지 않는다고 생각했지만 .. 그렇다.다시 한 번 고마워, 응원;) – noobi

0

당신은 TransactionScope에가 트랜잭션 PROC 또는 저장 프로 시저를 사용하는 경우, 당신은 당신이 그들을 호출하는 방법을 변경해야합니다

0

또한 WCF에 내장 된 트랜잭션 전파 기능에 관심이있을 수 있습니다. 기본적으로 WCF에 대한 각 웹 서비스 호출이 자동으로 트랜잭션을 생성하고 커밋하거나 롤백하는 방식으로 구성 할 수 있습니다. 기본적으로 전체 서비스 메서드 호출을 트랜잭션에 래핑합니다.

good MSDN writeup on it here이 있습니다.

고급 주제와 약간의 차이가있어 필요한 것을 지나치게 많이 들었을 수도 있지만 염두에 두어야 할 사항입니다.