我设计的简单事务控制
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                我设计的简单事务控制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            其中數據庫操作使用了Microsoft.ApplicationBlocks,請參考我的《Microsoft.ApplicationBlocks使用心得》
類結構圖:
相關文件:
接口:IManager.cs?IPlanManager.cs
實現:Manager.cs?PlanManager.cs
使用:Test.cs
其他相關文件不予說明
Test.cs:測試客戶端,可以進行單個功能類內多個方法的事務控制,如果要進行多個功能類的事務控制就需要修改基類Manager中數據庫連接的獲得方式,目前是簡單的獲取連接串后直接創建連接,實用時候應該從一個數據庫連接工廠類中獲得,這樣多個Manager類可以共享數據庫連接,進行事務控制,并可以有效地管理數據庫連接池。
using?System;
using?System.Collections;
using?ReceptionPlan.Data.Components;
using?ReceptionPlan.Data.IDAL;
using?ReceptionPlan.Data.DAL;
namespace?ReceptionPlan.Data.Services
{
????/**////?<summary>
????///?ReceptionPlan?的摘要說明。
????///?</summary>
????public?class?ReceptionPlanService
????{
????????public?ReceptionPlanService()
????????{????????????
????????}
????????/**////?<summary>
????????///?添加計劃
????????///?</summary>
????????///?<param?name="plan">計劃對象</param>
????????///?<returns>計劃ID</returns>
????????public?static?int?AddPlan(Plan?plan)
????????{
????????????IPlanManager?pm?=?new?PlanManager();
????????????pm.BeginTransaction();
????????????try
????????????{
????????????????int?id?=?pm.AddPlan(plan);
????????????????plan.Id?=?id;
????????????????plan.Name?=?"XXXX";
????????????????pm.ModifyPlan(plan)
????????????????pm.Commit();
????????????????return?id;
????????????}
????????????catch(Exception?ex)
????????????{
????????????????pm.Rollback();
????????????????throw?ex;
????????????}
????????}
}
  
IManager.cs
using?System;
namespace?ReceptionPlan.Data.IDAL
{
????/**////?<summary>
????///?IManager?的摘要說明。
????///?</summary>
????public?interface?IManager
????{
????????void?BeginTransaction();
????????void?Rollback();
????????void?Commit();
????}
}
  
IPlanManager.cs
using?System;
using?System.Collections;
using?ReceptionPlan.Data.Components;
namespace?ReceptionPlan.Data.IDAL
{
????/**////?<summary>
????///?IPlanManager?的摘要說明。
????///?</summary>
????public?interface?IPlanManager?:?IManager
????{
????????int?AddPlan(Plan?plan);
????????int?ModifyPlan(Plan?plan);
????}
}
  
Manager.cs
using?System;
using?System.Data;
using?System.Data.SqlClient;
using?System.Collections;
using?ReceptionPlan.Data.IDAL;
using?ReceptionPlan.Data.Utility;
namespace?ReceptionPlan.Data.DAL?{
????public?abstract?class?Manager?:?IManager?{
????????protected?SqlTransaction?trans;
????????protected?SqlConnection?conn;
????????protected?ArrayList?connList;
????????public?Manager()?{
????????????connList?=?new?ArrayList();
????????}
????????~Manager()?{
????????????if?(trans?!=?null)
????????????????trans.Rollback();
????????????/**//*
????????????foreach(SqlConnection?temp?in?connList)
????????????{
????????????????if(temp?!=null?&&?temp.State?!=?ConnectionState.Closed??)
????????????????????temp.Close();
????????????}*/
????????}
????????//public?SqlConnection?Connection
????????public?string?Connection?{
????????????get?{
????????????????return?Configs.CONN_STR;
????????????????/**//*
????????????????SqlConnection?temp?=?new?SqlConnection(Configs.CONN_STR);
????????????????connList.Add(temp);
????????????????return?temp;
????????????????*/
????????????}
????????}
????????public?void?BeginTransaction()?{
????????????conn?=?new?SqlConnection(Configs.CONN_STR);
????????????conn.Open();
????????????trans?=?conn.BeginTransaction();
????????}
????????public?void?Rollback()?{
????????????if?(trans?!=?null){????????????????
????????????????trans.Rollback();
????????????????trans?=?null;
????????????????conn.Close();
????????????}
????????}
????????public?void?Commit()?{
????????????if?(trans?!=?null){
????????????????trans.Commit();
????????????????trans?=?null;
????????????????conn.Close();
????????????}
????????}
????}
}
  
PlanManager.cs
using?System;
using?System.Collections;
using?Microsoft.ApplicationBlocks.Data;
using?System.Data;
using?System.Data.SqlClient;
using?ReceptionPlan.Data.Components;
using?ReceptionPlan.Data.IDAL;
using?ReceptionPlan.Data.Utility;
namespace?ReceptionPlan.Data.DAL
{
????/**////?<summary>
????///?PlanManager?的摘要說明。
????///?</summary>
????public?class?PlanManager?:?Manager,?IPlanManager
????{????????
????????public?PlanManager()
????????{
????????}
????????public?int?AddPlan(Plan?plan)
????????{
????????????int?id?=?-1;
????????????string?sql?=?string.Empty;
????????????try
????????????{
????????????????sql?=?string.Format("insert?into?[RP_Plan]?XXXX);
????????????????object?AID?=?SqlHelper.ExecuteScalar(trans,?CommandType.Text,?sql?);
????????????????id?=?Convert.ToInt32(AID);
????????????}
????????????catch(Exception?ex)
????????????{
????????????????throw?new?Exception(ex.ToString()?+?"\n?sql="?+?sql);
????????????}
????????????return?id;
????????}
????????public?int?ModifyPlan(Plan?plan)
????????{
????????????if?(plan.Id?<?0)
????????????????return?-1;
????????????string?sql?=?string.Empty;
????????????int?ret?=?-1;
????????????try
????????????{
????????????????sql?=?string.Format("update?RP_Plan??XXXX);
????????????????ret?=?SqlHelper.ExecuteNonQuery(trans,?CommandType.Text,?sql?);
????????????}
????????????catch(Exception?ex)
????????????{
????????????????throw?new?Exception(ex.ToString()?+?"\n?sql="?+?sql);
????????????}
????????????return?ret;
????????}
????}
}
  
 
                        
                        
                        類結構圖:
相關文件:
接口:IManager.cs?IPlanManager.cs
實現:Manager.cs?PlanManager.cs
使用:Test.cs
其他相關文件不予說明
Test.cs:測試客戶端,可以進行單個功能類內多個方法的事務控制,如果要進行多個功能類的事務控制就需要修改基類Manager中數據庫連接的獲得方式,目前是簡單的獲取連接串后直接創建連接,實用時候應該從一個數據庫連接工廠類中獲得,這樣多個Manager類可以共享數據庫連接,進行事務控制,并可以有效地管理數據庫連接池。
using?System;
using?System.Collections;
using?ReceptionPlan.Data.Components;
using?ReceptionPlan.Data.IDAL;
using?ReceptionPlan.Data.DAL;
namespace?ReceptionPlan.Data.Services
{
????/**////?<summary>
????///?ReceptionPlan?的摘要說明。
????///?</summary>
????public?class?ReceptionPlanService
????{
????????public?ReceptionPlanService()
????????{????????????
????????}
????????/**////?<summary>
????????///?添加計劃
????????///?</summary>
????????///?<param?name="plan">計劃對象</param>
????????///?<returns>計劃ID</returns>
????????public?static?int?AddPlan(Plan?plan)
????????{
????????????IPlanManager?pm?=?new?PlanManager();
????????????pm.BeginTransaction();
????????????try
????????????{
????????????????int?id?=?pm.AddPlan(plan);
????????????????plan.Id?=?id;
????????????????plan.Name?=?"XXXX";
????????????????pm.ModifyPlan(plan)
????????????????pm.Commit();
????????????????return?id;
????????????}
????????????catch(Exception?ex)
????????????{
????????????????pm.Rollback();
????????????????throw?ex;
????????????}
????????}
}
IManager.cs
using?System;
namespace?ReceptionPlan.Data.IDAL
{
????/**////?<summary>
????///?IManager?的摘要說明。
????///?</summary>
????public?interface?IManager
????{
????????void?BeginTransaction();
????????void?Rollback();
????????void?Commit();
????}
}
IPlanManager.cs
using?System;
using?System.Collections;
using?ReceptionPlan.Data.Components;
namespace?ReceptionPlan.Data.IDAL
{
????/**////?<summary>
????///?IPlanManager?的摘要說明。
????///?</summary>
????public?interface?IPlanManager?:?IManager
????{
????????int?AddPlan(Plan?plan);
????????int?ModifyPlan(Plan?plan);
????}
}
Manager.cs
using?System;
using?System.Data;
using?System.Data.SqlClient;
using?System.Collections;
using?ReceptionPlan.Data.IDAL;
using?ReceptionPlan.Data.Utility;
namespace?ReceptionPlan.Data.DAL?{
????public?abstract?class?Manager?:?IManager?{
????????protected?SqlTransaction?trans;
????????protected?SqlConnection?conn;
????????protected?ArrayList?connList;
????????public?Manager()?{
????????????connList?=?new?ArrayList();
????????}
????????~Manager()?{
????????????if?(trans?!=?null)
????????????????trans.Rollback();
????????????/**//*
????????????foreach(SqlConnection?temp?in?connList)
????????????{
????????????????if(temp?!=null?&&?temp.State?!=?ConnectionState.Closed??)
????????????????????temp.Close();
????????????}*/
????????}
????????//public?SqlConnection?Connection
????????public?string?Connection?{
????????????get?{
????????????????return?Configs.CONN_STR;
????????????????/**//*
????????????????SqlConnection?temp?=?new?SqlConnection(Configs.CONN_STR);
????????????????connList.Add(temp);
????????????????return?temp;
????????????????*/
????????????}
????????}
????????public?void?BeginTransaction()?{
????????????conn?=?new?SqlConnection(Configs.CONN_STR);
????????????conn.Open();
????????????trans?=?conn.BeginTransaction();
????????}
????????public?void?Rollback()?{
????????????if?(trans?!=?null){????????????????
????????????????trans.Rollback();
????????????????trans?=?null;
????????????????conn.Close();
????????????}
????????}
????????public?void?Commit()?{
????????????if?(trans?!=?null){
????????????????trans.Commit();
????????????????trans?=?null;
????????????????conn.Close();
????????????}
????????}
????}
}
PlanManager.cs
using?System;
using?System.Collections;
using?Microsoft.ApplicationBlocks.Data;
using?System.Data;
using?System.Data.SqlClient;
using?ReceptionPlan.Data.Components;
using?ReceptionPlan.Data.IDAL;
using?ReceptionPlan.Data.Utility;
namespace?ReceptionPlan.Data.DAL
{
????/**////?<summary>
????///?PlanManager?的摘要說明。
????///?</summary>
????public?class?PlanManager?:?Manager,?IPlanManager
????{????????
????????public?PlanManager()
????????{
????????}
????????public?int?AddPlan(Plan?plan)
????????{
????????????int?id?=?-1;
????????????string?sql?=?string.Empty;
????????????try
????????????{
????????????????sql?=?string.Format("insert?into?[RP_Plan]?XXXX);
????????????????object?AID?=?SqlHelper.ExecuteScalar(trans,?CommandType.Text,?sql?);
????????????????id?=?Convert.ToInt32(AID);
????????????}
????????????catch(Exception?ex)
????????????{
????????????????throw?new?Exception(ex.ToString()?+?"\n?sql="?+?sql);
????????????}
????????????return?id;
????????}
????????public?int?ModifyPlan(Plan?plan)
????????{
????????????if?(plan.Id?<?0)
????????????????return?-1;
????????????string?sql?=?string.Empty;
????????????int?ret?=?-1;
????????????try
????????????{
????????????????sql?=?string.Format("update?RP_Plan??XXXX);
????????????????ret?=?SqlHelper.ExecuteNonQuery(trans,?CommandType.Text,?sql?);
????????????}
????????????catch(Exception?ex)
????????????{
????????????????throw?new?Exception(ex.ToString()?+?"\n?sql="?+?sql);
????????????}
????????????return?ret;
????????}
????}
}
轉載于:https://www.cnblogs.com/dannyr/archive/2004/11/02/59518.html
總結
以上是生活随笔為你收集整理的我设计的简单事务控制的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Display Skin
- 下一篇: 继续Bargaining
