回滚c#

Zub*_*azi 9 c# ado.net

我有2个表查询和详细信息.在保存按钮上单击我已写入

fbsave();
fbsavedetails();
Run Code Online (Sandbox Code Playgroud)

fbsave()将数据保存在查询表中并将fbsavedetails()数据保存在详细信息表中.

现在,如果fbsavedetails()发生错误,则两个步骤都应该回滚.

可能吗?

Mar*_*ell 8

您可以显式创建一个事务并传递它,即

using(var connection = ...)
{
    connection.Open();
    using (var tran = connection.BeginTransaction())
    {
        try
        {
            FBSave(connection, tran);
            FBSaveDetails(connection, tran);
            tran.Commit();
        }
        catch
        {
            tran.Rollback();
            throw;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此处还必须设置Transactionon each命令,因此需要将其传入,并且所有命令必须位于同一连接对象上.


或者:你可以使用TransactionScope; 重要的是,在Open()发生TransactionScope获得自动入伍:

using(var tran = new TransactionScope())
{
    FBSave();
    FBSaveDetails();
    tran.Complete();
}
Run Code Online (Sandbox Code Playgroud)

要么:

using(var tran = new TransactionScope())
using(var connection = ...)
{
    connection.Open();
    FBSave(connection);
    FBSaveDetails(connection);
    tran.Complete();
}
Run Code Online (Sandbox Code Playgroud)

使用这种TransactionScope方法,您不需要设置任何特殊的东西 - 大多数都是自动的.您当然可以选择将连接传递给方法,但是它们也可以获得自己的连接,并且在大多数情况下它可以正常工作.


Nov*_*ice 7

您可以使用TransactionScope.

using(var scope = new TransactionScope())
{
   //Complete the transaction only when both inserts succeed. 
   scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

如果您没有完成transactioncope,它将被回滚.