4

您好,我是 C# 中事务范围的新手。我有两个插入查询,一个属于 UserAccountCreation,其中存储了 LoginCredentials,另一个是在 Employee 表中使用各自的 UserAccountID 作为外键插入员工详细信息。

我编写了两种不同的方法来插入到 UserAccount 表中,在插入到 UserAccount 之后,UserAccountID 被提取并插入到 Employee 表中。情况是当用户帐户创建成功而员工创建失败时,它必须回滚。所以,我想知道我们是否可以使用事务范围并在这两个插入方法之间调用?如果发生错误,我们是否可以回滚在此范围内调用的这些方法。示例代码:

private void CreateEmp()
{
  using (TransactionScope scope = new TransactionScope())
  {
    try
    {
        CreateUserAccount();
        CreateEmployee();
        scope.Complete();
    } 
    catch (TransactionAbortedException ex)
        {

    }
  }
}

帮助赞赏!提前致谢!

4

4 回答 4

2

您可以在事务范围内调用任意数量的函数。如果您希望两个方法可以处理它们自己的连接(打开/使用/关闭/处置),但它们将默默地成为环境事务的一部分,而无需我们传入任何内容。

于 2012-12-18T07:15:14.820 回答
2

应该回答你的问题。要快捷方式,只需阅读代码示例中的注释

于 2012-12-18T07:16:23.683 回答
0

是的。这就是我们使用事务范围的原因。

于 2012-12-18T07:18:56.607 回答
0

手头的任务: 当用户单击“更新”按钮时,我需要在 4 个表中插入一行。

以下对我来说效果很好:

我在 4 个更新方法所在的类中添加了一个变量,如果在 4 个方法中的任何一个中捕获到异常,则将其设置为 false。没有这个打电话tran.Complete();对我不起作用。

/* This variable is used to check if updating the scorecard succeeded. 
Set this variable to false in catch blocks of the 4 update methods. */

private bool bAllUpdated = true;

我的更新点击方法如下所示:

/* Showing the try-catch block only */
try
{
    using (TransactionScope tran = new TransactionScope())
    {
         UpdateMethod1();
         UpdateMethod2();
         UpdateMethod3();
         UpdateMethod4();

         if (bAllUpdated == true)
         {
             tran.Complete();
             lblSC_Success.Visible = true;
         }
         else
             throw new TransactionAbortedException();
    }
}

catch (TransactionAbortedException ex)
{
      bAllUpdated = false;
      lblSCEditWarning.Text = "There was an error and your changes where NOT saved. " + ex.Message;
}
catch (ApplicationException ex)
{
    bAllUpdated = false;
    lblSCEditWarning.Text = "There was an error and your changes where NOT saved. " + ex.Message;
}
catch (Exception ex)
{
    bAllUpdated = false;
    lblSCEditWarning.Text = "There was an error and your changes where NOT saved. " + ex.Message;
}
finally
{
    // Clean up the temp tables
    // Refresh page
}
于 2015-11-05T17:15:10.070 回答