回滚插入到 SQL Server 2005 中的多个表

RollBack insert to multiple tables in SQL Server 2005

我想第一次使用事务和回滚,但我很困惑,好像在我的情况下该怎么做?

我想在多个table中插入记录,我需要使用for循环在一个table中插入多个记录。如果发生错误,我还想从所有 table 中删除所有记录。

我们以3table秒为例:

   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或更高版本..

提前致谢

编辑

目前我正在使用多个存储过程(每个 table)执行此操作,我想在其中实现一个事务。如果可能,使用 Asp.net 对我来说也可以。

这是非常基本的 ADO.NET - 您需要设置您的连接和事务,然后您需要在该事务中 "participate" 三个命令。你执行你的命令,如果一切顺利,你提交事务。如果有任何失败,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();
       }
    }
}