您好我是C#中交易范围的新手。我有两个插入查询,一个属于UserAccountCreation,其中存储了LoginCredentials,另一个是插入员工详细信息,其中Employee表中的UserAccountID为外键。
我在UserAccount表中编写了两种不同的方法,在插入UserAccount后,UserAccountID被提供并插入到Employee表中。 情况是当UserAccount创建成功并且Employee Creation失败时,它必须ROLLBACK。那么,我想知道我们是否可以使用Transaction scope并在两者之间调用这两个Insert方法?如果发生错误,我们可以回滚这些在此范围内调用的方法吗? 示例代码:
private void CreateEmp()
{
using (TransactionScope scope = new TransactionScope())
{
try
{
CreateUserAccount();
CreateEmployee();
scope.Complete();
}
catch (TransactionAbortedException ex)
{
}
}
}
帮助感谢! 在此先感谢!
答案 0 :(得分:2)
This应该回答你的问题。要快捷方式,只需阅读代码示例中的注释
答案 1 :(得分:1)
您可以在事务范围内调用任意数量的函数。 如果你想要两个方法可以处理他们自己的连接(open / use / close / dispose),但是他们将默默地成为环境事务的一部分,而我们不必传递任何东西。
答案 2 :(得分:0)
是。这就是我们使用交易范围的原因。
答案 3 :(得分: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
}