1

如何在前端用 SQL 事务实现两张表插入代码?

我有两张桌子,TblMasterTblSub。如果Tblsub插入失败,则TblMaster记录应该回滚。

ExecuteNonQuery在 SQL 助手类中有一个用于插入记录的通用函数。

请建议我解决此问题的方法。

4

3 回答 3

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();
}
于 2014-01-17T05:26:08.677 回答
1

试试这个方法

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
于 2014-01-17T05:23:46.653 回答
0

使用这样的事务范围(您需要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
        }
    }
}
于 2014-01-17T05:29:53.880 回答