轉:事務的使用(ADO.NET和SQL SERVER)

來源:互聯網
上載者:User

  最近幾天,在做項目的過程中,寫了一些預存程序用來處理一些商務邏輯,發現在資料庫中只有很少幾個預存程序,而我這邊就一個很小的模組都要涉及到幾張表的操作,寫預存程序是最方便的,而且效率也是最高的。於是,我問了一下這邊的負責人,他們之前開發的那些模組,怎麼沒有寫幾個預存程序?而負責人的給我的回答是,以後別人來維護,出現問題時,跟蹤調試寫預存程序不好調試。我不敢苟同這種說法。

  既然項目負責人不讓用預存程序,那隻能用代碼實現這些商務邏輯了,我選擇用ADO.NET中的事務。

  我要實現的功能是上傳附件的功能,需要涉及到3張表,分別是附件表格Appendix,報告基礎資料表Report和零件表Part。另外還有一張表示Appendix與Report的中間表StatusManage。上傳附件時,需要向appendix表中插入一條附加資訊記錄,同時在頁面可以修改Report表和Part表中的資料,表關係如

 

儲存按鈕中的代碼如下:

  /// <summary>
    /// 上傳附件儲存事件
    ///  modify by dlw 2010-07-01
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lbtnSave_Click(object sender, EventArgs e)
    {
        try
        {
            UpladFile();//這是將檔案上傳到伺服器上的方法,可以不用考慮這個方法。

    //這是擷取連接字串的方法
            string conStr = Common.CommonDB.CreateConnection().ConnectionString;
            using (SqlConnection con = new SqlConnection(conStr))
            {
                con.Open();
                SqlTransaction tran;//定義事務
                SqlCommand com = con.CreateCommand();
                tran = con.BeginTransaction();//建立事務
                com.Transaction = tran;//為sqlcommand對象指定定義的事務
                try
                {
                    //插入一條新的附件記錄
                    com.CommandText = string.Format(@"insert into dbo.PAB_Appendix (FlowID,[FileName],FilePath,FileRemark,UploadTime,Uploador)
                                             values('{0}','{1}','{2}','{3}','{4}','{5}')",
                                                      ViewState["FlowID"].ToString(),
                                                      FileUpload.FileName,
                                                      AppDomain.CurrentDomain.BaseDirectory + "UploadFile//",
                                                      "",
                                                      DateTime.Now.ToString(),
                                                      User.Identity.Name
                                                      );
                    com.ExecuteNonQuery();
                    //更新pab基礎資料表中的資料
                    com.CommandText = string.Format(@"update dbo.PAB_ReportList set CarType='{0}',Fachabteilung='{1}',
                                        FOP_ID='{2}',FOP_Name='{3}',FactoryCode='{4}' where PAB_ReportID='{5}'",
                                                    ddlCarType.SelectedItem.Value.Trim(),//車型
                                                    ddlDept.SelectedItem.Value.Trim(),//科室
                                                    hiFop.Value,//fop
                                                    txtFOP.Text.Trim(),//
                                                    txtFactoryCode.Text.Trim(),//廠家
                                                    ViewState["PAB_ReportID"].ToString());
                    com.ExecuteNonQuery();
                    //更新主零件資訊
                    com.CommandText = string.Format(@"update PAB_PartList set Part_Num='{0}' where PAB_PLID in
                                           (select PAB_PartList.PAB_PLID  from PAB_ReportList,PAB_PartList
                                            where PAB_ReportList.PAB_ReportID=PAB_PartList.PAB_ReportID
                                             and  PAB_PartList.isMainPart=1
                                             and PAB_ReportList.PAB_ReportID='{1}')",
                                                    txtMainPartNum.Text.Trim(),
                                                    ViewState["PAB_ReportID"].ToString());
                    com.ExecuteNonQuery();
                    tran.Commit();// 事務提交
                    Response.Write("<script>alert('上傳成功!');returnValue=true;window.close();</script>");
                }
                catch (Exception ex)
                {
                    tran.Rollback();//交易回復
                }
                finally
                {
                    tran.Dispose();//事務銷毀
                }
            }
        }
        catch (Exception ex)
        {
            Response.Write("<script>alert('上傳失敗!')</script>");
        }
    }

上面的代碼中,用紅色標示出來的地方,是使用事務的地方。

總結一下,ADO.NET使用事務的格式是什麼樣子的呢? 把上面範例程式碼中用紅色標示出來的代碼提取出來,如下:

//這是擷取連接字串的方法
            string conStr = Common.CommonDB.CreateConnection().ConnectionString;
            using (SqlConnection con = new SqlConnection(conStr))
            {
                con.Open();
                SqlTransaction tran;//定義事務
                SqlCommand com = con.CreateCommand();
                tran = con.BeginTransaction();//開始一個本地事務
                com.Transaction = tran;//為sqlcommand對象指定定義的事務
                try
                {

       //TODO

        //處理一些商務邏輯
        tran.Commit();// 事務提交
                }
                catch (Exception ex)
                {
                    tran.Rollback();//交易回復
                }
                finally
                {
                    tran.Dispose();//事務銷毀
                }
            }

至此,用代碼實現的商務邏輯就告一段落了。

剛開始的時候,我已經說過了,我已經用預存程序結合事務實現了上面的商務邏輯,下面把我用預存程序實現的商務邏輯給大家分享一下,希望對大家有一定的參考價值!

ALTER procedure [dbo].[SP_PAB_UploadAppendix]
(
 @FileName varchar(50),--上傳附件名稱
 @FilePath varchar(100),--上傳附件路徑
 @FileRemark varchar(200),--附件備忘
 @Operator varchar(38),--操作人
 @CarType varchar(10),--車型
 @MainPartNum varchar(20),--主零件編號
 @Fachabteilung varchar(10),--科室
 @FOP_ID varchar(38),--負責人id
 @FOP_Name varchar(50),--負責人名稱
 @FactoryCode Varchar(10),--廠家編號
 @FactoryName Varchar(100),--廠家名稱
 @PAB_ReportID int,
 @StatusID int --
)
as
begin
 begin try
  begin tran --事務開始
   --擷取與reportlist中status對應的flowid
   declare @FlowID int
   select @FlowID=PAB_StatusManage.FlowID from PAB_StatusManage
    where PAB_ReportID=@PAB_ReportID and StatusID=@StatusID
   --向附件表格中插入資料
   insert into dbo.PAB_Appendix (FlowID,[FileName],FilePath,FileRemark,UploadTime,Uploador)
    values(@FlowID,@FileName,@FilePath,@FileRemark,getdate(),@Operator)
 
   --更新reportlist表中的資料
   update dbo.PAB_ReportList set CarType=@CarType,Fachabteilung=@Fachabteilung,
     FOP_Name=@FOP_Name,FactoryCode=@FactoryCode where PAB_ReportID=@PAB_ReportID
   --更新partlist表中主零件的資料
   
   if exists(select 1  from PAB_ReportList,PAB_PartList where PAB_ReportList.PAB_ReportID=PAB_PartList.PAB_ReportID and  PAB_PartList.isMainPart=1 and PAB_ReportList.PAB_ReportID=@PAB_ReportID)
   begin
    update PAB_PartList set Part_Num=@MainPartNum where PAB_PLID in
    (select PAB_PartList.PAB_PLID  from PAB_ReportList,PAB_PartList where PAB_ReportList.PAB_ReportID=PAB_PartList.PAB_ReportID and  PAB_PartList.isMainPart=1 and PAB_ReportList.PAB_ReportID=@PAB_ReportID)
   end

  commit tran--事務提交
 end try
 begin catch
  rollback tran--交易回復
 end catch
end

上面紅色標出的地方是使用事務的地方。

 總結一下,把紅色部分代碼提取出來,如下:

 begin try
    begin tran --事務開始

    --處理一些商務邏輯

    commit tran--事務提交
 end try
 begin catch
    rollback tran--交易回復
 end catch

 

至此,兩種方式都給大家貼示出來了,希望對大家有一定的協助。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.