Вставка в две таблицы с транзакцией SQL

Как реализовать код вставки из двух таблиц с помощью транзакции SQL на внешнем интерфейсе?

У меня есть две таблицы, TblMaster а также TblSub, Если Tblsub вставить не удастся, то TblMaster запись должна быть откачена.

У меня есть общая функция ExecuteNonQuery в классе помощника SQL для вставки записей.

Пожалуйста, предложите мне способ решить эту проблему.

3 ответа

Пример в C#

SqlTransaction transaction = null;
SqlConnection con = null;

// they will be used to decide whether to commit or rollback the transaction
bool debitResult = false;
bool creditResult = false;

try
{
    con = new SqlConnection(CONNECTION_STRING);
    con.Open();

    // lets begin a transaction here
    transaction = con.BeginTransaction();

    // Let us do a debit first
    using (SqlCommand cmd = con.CreateCommand())
    {
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "Insert into Table1";   // Query here

        // assosiate this command with transaction
        cmd.Transaction = transaction;

        debitResult = cmd.ExecuteNonQuery() == 1;
    }

    // A dummy throw just to check whether the transaction are working or not
    //throw new Exception("Let see..."); // uncomment this line to see the transaction in action

    // And now do a credit
    using (SqlCommand cmd = con.CreateCommand())
    {
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "Insert into Table2";   // Query here

        // assosiate this command with transaction
        cmd.Transaction = transaction;

        creditResult = cmd.ExecuteNonQuery() == 1;
    }

    if (debitResult && creditResult)
    {
        transaction.Commit();
    }
}
catch
{
    transaction.Rollback();            
}
finally
{
    con.Close();
}

Попробуй так

BEGIN TRANSACTION tran1
  BEGIN  TRY
    --Insert into Table1
    --Insert into Table2
COMMIT TRANSACTION  tran1                           
  END TRY

BEGIN CATCH
   ROLLBACK TRANSACTION tran1 
      raiserror('Cannot commite transaction',16,1,@@error);
   return;
END CATCH

Используйте область транзакции, как это (вам нужно сослаться на System.Transactions Библиотека.NET в вашем проекте с помощью пункта меню "Добавить ссылку"):

using (TransactionScope scope = new TransactionScope())
{
    using (SqlConnection conn = new SqlConnection(<connectionString>))
    {
        conn.Open()

        try
        {
            // Do your stuff
            ...

            // Commit the transaction
            scope.Complete();
        }
        catch (...)
        {
            // Handle exceptions, transaction is rolled back automatically, as
            // "Complete" was not called
        }
    }
}
Другие вопросы по тегам