其中数据库操作使用了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;
        }
    }
}

转载于:https://www.cnblogs.com/dannyr/archive/2004/11/02/59518.html

我设计的简单事务控制相关推荐

  1. 51单片机 时间控制的不同时段交通灯控制设计(简单版)

    这个交通灯的设计时简单版,只有一个路口(不是十字路口)的那种(想要实现十字路口可以对代码稍加修改) 使用的开发软件:Keil uVision5 单片机类型为:C51 语言类型:C语言 在这里说一下实现 ...

  2. controller的异常处理以及service层的事务控制___controller层 trycatch不影响service层抛出的异常

    controller的异常处理以及service层的事务控制 最近写代码涉及到一些事务,上午终于把代码给理顺了,之前不太清楚在哪里做异常处理,导致代码遍地try-catch,相当难看. 还是基于con ...

  3. Spring中的事务控制

    Chapter 1. Spring中的事务控制(Transacion Management with Spring) Table of Contents 1.1. 有关事务(Transaction)的 ...

  4. Spring中的事务控制(Transacion Management with Spring)

    1.1. 有关事务(Transaction)的楔子 1.1.1. 认识事务本身1.1.2. 初识事务家族成员 1.2. 群雄逐鹿下的Java事务管理 1.2.1. Java平台的局部事务支持1.2.2 ...

  5. Spring——DAO层、Spring JDBC、Spring事务控制

    目录 一.Spring对持久层技术支持 1.Spring支持的持久层技术 2.Spring JDBC 2.1. JDBCTemplate类 2.2.Spring JDBC CRUD操作 2.3.Spr ...

  6. Spring中的事务控制学习中(转)

    1.1. 有关事务(Transaction)的楔子 1.1.1. 认识事务本身 1.1.2. 初识事务家族成员 1.2. 群雄逐鹿下的Java事务管理 1.2.1. Java平台的局部事务支持 1.2 ...

  7. Spring中的事务控制学习中

    Chapter 1. Spring中的事务控制(Transacion Management with Spring) Table of Contents 事务管理(Transaction Manage ...

  8. Insight Mybatis JdbcTemplate 混合事务控制的实现

    混合使用的背景 最近项目中需要引入工作流引擎,实现业务和流程设计.流转的解耦. 工作流流引擎选用的是snaker,轻量.易上手.可定制.访问数据库用的是JdbcTemplate . 项目中原有的持久层 ...

  9. 【Spring】事务控制API

    Spring事务控制需要明确 1. JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计==业务层==的事务处理解决方案. 2. Spring框架提供了一组事务控制的接口.在S ...

最新文章

  1. 23岁一无所有怎么办_我搬到国外去创业,然后一无所有。
  2. 漫谈Google Percolator分布式事务
  3. 聊聊技术写作的个人体会
  4. a5d2 phy驱动
  5. 五一期间,飞鸽传书我又更新了。
  6. python3.6教程案例分析_python 3.6 --实战Scrapy
  7. matlab ode45 初值,为什么设定的初值在ode45里无效?
  8. 企业如何实现大数据分析平台
  9. 中美线径对照表_中国线径与英美德线规对照表
  10. 苏教版六年级上册计算机教案,苏教版六年级数学上册最新全册教案
  11. C语言函数:even(n),fflush(stdin)
  12. android音乐视频播放器,android音乐视频播放器.doc
  13. Android 实现搜索历史(1)
  14. (转)罗振宇跨年演讲:哪来直接登顶的人生,只有不断迭代的历程
  15. 获取百度首页的源代码
  16. 华为智能家居app未能连接上远程云服务_智能家居平台介绍:华为HiLink
  17. python 提取pdf表格_用Python提取pdf文件中的表格数据
  18. 用python画画的原理_matplotlib绘图的核心原理讲解
  19. 常用的35个Linux命令合集
  20. 血性的青,尿性的春——《中国合伙人》影评

热门文章

  1. 我的Go+语言初体验——10秒真男人游戏
  2. 【windows10 计划任务】【实施工程师】
  3. Oracle 11g新特性:索引不可见
  4. RMAN 的备份保留策略
  5. copy_{to, from}_user()的思考
  6. C#基础加强(7)之ref与out
  7. 关于css浮动的一点思考
  8. redis的安装和测试
  9. Azure 6 月新公布
  10. 剑指OFFER之二维数组中的查找(九度OJ1384)