回滚插入到 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();
}
}
}
我想第一次使用事务和回滚,但我很困惑,好像在我的情况下该怎么做?
我想在多个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();
}
}
}