c# - 在 C# 中回滚

标签 c# ado.net

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

fbsave();
fbsavedetails();

fbsave() 保存查询表中的数据,fbsavedetails() 保存明细表中的数据。

现在,如果 fbsavedetails() 发生错误,那么这两个步骤都应该回滚。

这可能吗?

最佳答案

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

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

请注意,此处您必须还为每个命令设置Transaction,因此需要传入它,并且所有命令都必须在同一个连接对象上.


或者:你可以使用TransactionScopeOpen() 发生在 TransactionScope 中以获得自动登记很重要:

using(var tran = new TransactionScope())
{
    FBSave();
    FBSaveDetails();
    tran.Complete();
}

或:

using(var tran = new TransactionScope())
using(var connection = ...)
{
    connection.Open();
    FBSave(connection);
    FBSaveDetails(connection);
    tran.Complete();
}

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

关于c# - 在 C# 中回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13947274/

相关文章:

c# - 用于服务/使用 OData 接口(interface)的 Entity Framework 的替代方案

c# - 等效于 DbContext 上的 ObjectContext.AddObject(entityName, entity)

asp.net - 在 ASP.NET 中管理 Entity Framework ObjectContext

c# - ASP.NET DataPager 不保留 QueryString 参数顺序

c# - 如何使 HttpResponse.Flush() 异步?

C# 允许反向引用嵌套类吗?

c# - SqlCommand 对象,CommandTimeout 的时间长度是多少?

c# - ASP.NET Identity - 如何将 dbo.AspNetUsers.Id 更改为非聚集索引?

c# - 在 Silverlight 中列出附加属性

c# - SQL Server : sp_executesql parameters not working