最近幾天,在做項目的過程中,寫了一些預存程序用來處理一些商務邏輯,發現在資料庫中只有很少幾個預存程序,而我這邊就一個很小的模組都要涉及到幾張表的操作,寫預存程序是最方便的,而且效率也是最高的。於是,我問了一下這邊的負責人,他們之前開發的那些模組,怎麼沒有寫幾個預存程序?而負責人的給我的回答是,以後別人來維護,出現問題時,跟蹤調試寫預存程序不好調試。我不敢苟同這種說法。
既然項目負責人不讓用預存程序,那隻能用代碼實現這些商務邏輯了,我選擇用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
至此,兩種方式都給大家貼示出來了,希望對大家有一定的協助。