2016-08-11 3 views
1

여러 삽입 및 업데이트 쿼리에 단일 함수로 트랜잭션을 사용할 수 있습니까? 예 :여러 SQL 쿼리에 트랜잭션 적용

private void button1_Click(object sender, EventArgs e) 
    { 
     // transaction 
     SqlConnection objConnection = new SqlConnection(annual_examination_system.Properties.Settings.Default.connString); 
     SqlTransaction objTransaction = null; 

     int count = 0; 

     try 
     { 
      objConnection.Open(); 
      objTransaction = objConnection.BeginTransaction(); 

      string q1 = "update query" 
      SqlCommand objCommand1 = new SqlCommand(q1, objConnection, objTransaction); 
      objCommand1.ExecuteNonQuery(); 
      objTransaction.Commit(); 

      string q2 = "insert query" 
      SqlCommand objCommand1 = new SqlCommand(q2, objConnection, objTransaction); 
      objCommand1.ExecuteNonQuery(); 
      objTransaction.Commit(); 
     } 

     catch (Exception ex) 
     { 
      objTransaction.Rollback(); 
      MessageBox.Show(ex.Message); 
      MessageBox.Show("Exception, Row :" + count); 
      MessageBox.Show("Transaction Rollback."); 
     } 

     finally 
     { 
      // Close the connection. 
      if (objConnection.State == ConnectionState.Open) 
      { 
       objConnection.Close(); 
      } 
     } 

이제는 업데이트 용이고 삽입 용인 두 가지 쿼리가 있습니다. 그래서 그들에게 개별적으로 거래를 적용해야합니까 아니면 하나의 거래가 양쪽 모두에 적용될 수 있습니까?

+0

'update'와'insert' 둘 다 커밋되거나 단일 트랜잭션으로 롤백 될 필요가 있다면 마지막'ExecuteNonQuery' 다음에'commit' 만 사용하십시오. – Serg

+0

나는 그것을 시도했다. 그러나 그것은 시간 초과가 만료되었다. –

답변

2

두 쿼리 모두 동일한 트랜잭션을 사용할 수 있습니다.

SqlTransaction tran; 

지금 모두 쿼리

이를 사용하여
using(SqlConnection connection=new SqlConnection(connection_string)) 
{ 
    connection.Open(); 
    tran = connection.BeginTransaction(); 
    cmd = new SqlCommand(query1, connection, tran); 
    cmd1 = new SqlCommand(query2, connection, tran); 
    count = cmd.ExecuteNonQuery(); 
    count = count + cmd1.ExecuteNonQuery(); 
    tran.Commit(); 
} 

업데이트 : 다음은 예입니다 연결이 그 문제의 폐쇄되지 않습니다. 코드를 편집했습니다. 업데이트를 참조하십시오.

+0

"시간 초과가 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과했거나 서버가 응답하지 않습니다." –

+0

연결 때문에 자동으로 닫히지 않습니다. 편집 내용을 확인하십시오. –

+0

또한 확인하십시오. http://stackoverflow.com/questions/8602395/timeout-expired-the-timeout-period-elapsed-prior-to-completion-of-theoperation –