如何在前端用 SQL 事务实现两张表插入代码?
我有两张桌子,TblMaster
和TblSub
。如果Tblsub
插入失败,则TblMaster
记录应该回滚。
我ExecuteNonQuery
在 SQL 助手类中有一个用于插入记录的通用函数。
请建议我解决此问题的方法。
如何在前端用 SQL 事务实现两张表插入代码?
我有两张桌子,TblMaster
和TblSub
。如果Tblsub
插入失败,则TblMaster
记录应该回滚。
我ExecuteNonQuery
在 SQL 助手类中有一个用于插入记录的通用函数。
请建议我解决此问题的方法。
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
}
}
}