2016-08-11 2 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

Если вам нужно как «обновление», так и «вставить» для выполнения или откат в качестве отдельной транзакции, используйте только «commit» после последнего «ExecuteNonQuery». – 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(); 
} 

Update: соединение не закрывается, что это проблема. Я редактировал код. См. Обновление.

+0

выдает сообщение об ошибке .. «Истекло время ожидания, период ожидания до истечения срока действия или сервер не отвечает». –

+0

Его соединение не закрывается автоматически. См. Изменения. –

+0

проверьте это также http://stackoverflow.com/questions/8602395/timeout-expired-the-timeout-period-elapsed-prior-to-completion-of-the-operation –

Смежные вопросы