从其他表单回滚Sql事务

时间:2013-09-30 10:05:12

标签: c# visual-studio-2010 sql-server-2008-r2 sqltransaction

我有2个表格: enter image description here 1.MainForm:

要求用户输入姓名,Family,然后有一个名为“付款明细”的按钮(打开Form2)。

2.Form2

用户输入付款明细并单击“保存”按钮。然后,此事务在sql表中插入新行,此表单将被关闭(步骤2)。虽然MainFrom仍处于打开状态,但我想,在用户点击MainForm上的Save按钮(步骤3)时,Form2的事务已提交,但如果用户关闭Main表单,则Form2事务支持回滚。

我很感激您对此方案的建议?

去抛出步骤1,2,3

2 个答案:

答案 0 :(得分:1)

我认为你正在寻找这样的东西:

class MainForm()
{
    private TransactionScope _scope;
    public void SaveButton_Click()
    {
        _scope.Complete();
        Close();
    }
    public MainForm()
    {
        _scope = new TransactionScope();
    }
    ~MainForm()
    {
        _scope.Dispose();
    }
}

但是,我强烈建议您这样做。由于您可能需要等待很长时间才能完成输入,因此您将遇到有关事务生命周期和锁定数据库记录的各种问题。

根据您的需要,请考虑选择以下解决方案之一:

  • 如果用户点击MainForm中的取消,只需再次删除创建的交易。

  • 将输入的值从交易表单传递到主表单,并且只有在用户单击主表单的保存按钮时才保存交易。

答案 1 :(得分:0)

我的理解是,您的最终目标是保存在数据库名称姓氏中,然后最终保存付款详细信息,例如日期和金额。出于自己的原因,您不会以两种不同的形式显示这些输入字段。因此,表格1可以保持不变。当表单2打开时,您需要阻止用户关闭Form1,直到单击表单2上的保存或取消。 对于这种情况有各种可能的方法,简单的方法是在表格2打开时直到表格1中删除关闭按钮。为此,您可以实现以下目标:

private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams
{
   get
  {
   CreateParams myCp = base.CreateParams;
   myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON ;
   return myCp;
  }
}

上述参考资料是codeproject

另一种选择可能是使您的Form1和Form 2不能在屏幕上移动并相互重叠,以便用户无法访问Form 1的关闭按钮,因此他被迫关闭Form 2以访问Form 1。可以在SO上找到此功能的参考。还有其他方法可以做到这一点,但这就是我现在想到的。请告诉我们。