0

私はプログラミングに比較的慣れておらず、最初の本格的なクライアントアプリを構築しています。1つのフォームには、次のように、SQLデータベースとの非常に多くのトランザクションを実行するボタンがあります。

private void btnALSave_Click(object sender, EventArgs e)
    {
        try
        {
            //...consider any Special Actions...//

            bool check = Automation_ALHistory_Saved(cboALHistoryType.Text);
            if (check == true)
            {
                //...create History item...//

                cHistory h = new cHistory();
                h.CaseNo = txtCaseNo.Text;
                h.HistoryType = cboALHistoryType.Text;
                h.HistoryDesc = txtALHistoryNote.Text;
                h.Save();

                //...actioned Diary marked complete...//

                cDiary.Completed(txtDiaryID.Text);                                        

                //...create new Diary (with exceptions)...//

                string strNextDiaryID = "";
                if (cboALHistoryType.Text != "Diary Cancelled" && cboALHistoryType.Text != "Case Closed")
                {
                    aMyDate cM = new aMyDate(txtALNextDueDate.Text);
                    DateTime pDate = cM.GetDate();
                    cDiary d = new cDiary();
                    d.CaseNo = txtCaseNo.Text;
                    d.DiaryType = cboALNextType.Text;
                    d.DiaryUserFor = cboALNextFor.Text;
                    d.DiaryNote = txtALNextNote.Text;
                    d.DiaryDueDate = pDate.ToString();
                    d.Save();
                    strNextDiaryID = d.DiaryID;
                }

                //...invoke KPI Manager...//

                int intActionedDiaryID = Int32.Parse(txtALDiaryID.Text);
                int intHistoryID = Int32.Parse(h.HistoryID);
                int intNextDiaryID = Int32.Parse(strNextDiaryID);
                cKPIManager kpi = new cKPIManager(intActionedDiaryID, intHistoryID, intNextDiaryID);

                //...reset forms...//

                ClearActionLinks();
                PopulateForm();
                tabCase.SelectTab("tabDiary");
            }
        }
        catch (Exception eX)
        {
            string eM = "Error attempting to save Diary / History Actions";
            aError err = new aError(eX, eM);
            MessageBox.Show(eM + Environment.NewLine + eX.Message);
        }
    }      

私の質問では、これらすべてが何をするかは重要ではありません。私が本当に知っておく必要があるのは、このメソッドの実行中にデータベースに加えられたすべての変更を防止(または元に戻す)するための最善の方法です。基本的に、メソッドの成功(またはその他)が「オールオアナッシング」シナリオである必要があります。メソッドが最後の行で失敗した場合、その前にメソッドが行ったすべてのことを元に戻す必要があります(サーバー上のデータに加えられた変更に関して)。

この初心者のためのアドバイスをいただければ幸いです。

4

1 に答える 1

2

TransactionScopeクラスを使用する

try
{
    // Encapsulate your data access code in this using
    using (TransactionScope scope = new TransactionScope())
    {


        .....

        scope.Completed();
    }
}
于 2012-06-26T09:23:12.283 に答える