2015-01-24 3 views
2

Я хочу использовать транзакцию и откат в первый раз, но я смущен, как будто в моем случае?Вставка RollBack в несколько таблиц в SQL Server 2005

Я хочу вставить записи в несколько таблиц, и мне нужно использовать для цикла, чтобы вставить более одной записи в одну таблицу. А также я хочу удалить все записи из всех таблиц, если произошла какая-то ошибка.

Давайте возьмем 3 таблицы в качестве примера:

Insert into table1 values (a, b, c); 

    for(int i = 0; i < gridview1.rows.count; i++) 
    { 
     Insert into table 2 values (i, b, c); 
    } 

    Insert into table 3 values (a, b, c); 

Так что это просто короткий пример того, что я хочу. Я попробовал несколько учебных пособий, но они, похоже, для разных случаев и довольно легкие.

я должен использовать SQL Server 2005 и не могу пойти на 2008 или выше ..

Заранее спасибо

Редактировать

В настоящее время я делаю это с помощью многократной хранимой процедуры (один для каждая таблица) И я хочу реализовать в ней транзакцию. Использование Asp.net, если возможно, также будет хорошо для меня.

ответ

3

Это очень простой ADO.NET - вам необходимо настроить соединение и транзакцию, а затем вам понадобятся три команды, которые «участвуют» в этой транзакции. Вы выполняете свои команды, и если все будет хорошо, вы совершаете транзакцию. Если что-то не удастся, try...catch будет удалять и откатывать транзакцию до состояния, прежде чем все это начнется.

код будет выглядеть примерно так:

// set up your connection 
using (SqlConnection conn = new SqlConnection("--your-connection-string-here--")) 
{ 
    // start a transaction 
    using (SqlTransaction transaction = conn.BeginTransaction()) 
    { 
     try 
     { 
      conn.Open(); 

      // create a command for your first stored procedure 
      // and make sure it uses the transaction from above 
      using (SqlCommand cmdProc1 = new SqlCommand("dbo.Procedure1Name", conn, transaction)) 
      { 
       // set the parameters 
       cmdProc1.Parameters.Add("@ParamA", SqlDbType.Int).Value = a; 
       cmdProc1.Parameters.Add("@ParamB", SqlDbType.Int).Value = b; 
       cmdProc1.Parameters.Add("@ParamC", SqlDbType.Int).Value = c; 

       // execute stored procedure 
       cmdProc1.ExecuteNonQuery(); 
      } 

      // create a command for your second stored procedure 
      // and make sure it uses the transaction from above 
      using (SqlCommand cmdProc2 = new SqlCommand("dbo.Procedure2Name", conn, transaction)) 
      { 
       // set the parameters 
       cmdProc2.Parameters.Add("@ParamI", SqlDbType.Int); 
       cmdProc2.Parameters.Add("@ParamB", SqlDbType.Int); 
       cmdProc2.Parameters.Add("@ParamC", SqlDbType.Int); 

       // loop and set parameter values 
       for (int i = 0; i < gridview1.rows.count; i++) 
       { 
        cmdProc2.Parameters["@ParamI"].Value = i; 
        cmdProc2.Parameters["@ParamB"].Value = b; 
        cmdProc2.Parameters["@ParamC"].Value = c; 

        cmdProc2.ExecuteNonQuery(); 
       } 
      } 

      // create a command for your third stored procedure 
      // and make sure it uses the transaction from above 
      using (SqlCommand cmdProc3 = new SqlCommand("dbo.Procedure3Name", conn, transaction)) 
      { 
       // set the parameters 
       cmdProc3.Parameters.Add("@ParamA", SqlDbType.Int).Value = a; 
       cmdProc3.Parameters.Add("@ParamB", SqlDbType.Int).Value = b; 
       cmdProc3.Parameters.Add("@ParamC", SqlDbType.Int).Value = c; 

       // execute stored procedure 
       cmdProc3.ExecuteNonQuery(); 
      } 

      // if everything went well - commit the transaction! 
      transaction.Commit(); 
     } 
     catch (Exception exc) 
     { 
      // log the exception, rollback the transaction 
      transaction.Rollback(); 
     } 
    } 
} 
+0

Это хорошо выглядит и довольно легко to..i пытаюсь реализовать. просто для моих знаний вы можете объяснить мне, как они откатывают его? я имею в виду, когда он вставлен, то как он удаляет эту запись, поскольку мы не упоминали удаление запроса ... – ALOK

+0

И еще один: использует ли это влияние на производительность страниц? – ALOK

+0

@ALOK: откат возвращает базу данных в состояние ** до начала транзакции ** - это все, что вам нужно знать. Как это делается подробно, это не имеет значения и зависит от конкретной базы данных и многих других факторов. Просто будьте уверены: откат возвращается в состояние как было до начала транзакции –

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