看完了传智播客的视频后,因为还有时间就想着做点什么项目,网上买了一个.net程序,力软公司的做得相当完善。

      框架链接: 

      下面我们来谈谈框架:

      1,首先是Dal层

    

efcord sqlite 三层架构 三层架构 动态sql_数据库

抽出最主要的Database层:很复杂啊!

先来个甜点

public class Database:IDatabase
    {
        #region 构造函数
        public static string connString { get; set; }
        /// <summary>
        /// 构造方法
        /// </summary>
        public Database(string connstring)
        {
            DbHelper dbhelper = new DbHelper(connstring);
        }
        /// <summary>
        /// 数据库连接对象
        /// </summary>
        private DbConnection dbConnection { get; set; }
        /// <summary>
        /// 事务对象
        /// </summary>
        private DbTransaction isOpenTrans { get; set; }
        /// <summary>
        /// 是否已在事务之中
        /// </summary>
        public bool inTransaction { get; set; }
        /// <summary>
        /// 事务开始
        /// </summary>
        /// <returns></returns>
        public DbTransaction BeginTrans()
        {
            if (!this.inTransaction)
            {
                dbConnection = DbFactory.CreateDbConnection(DbHelper.ConnectionString);
                if (dbConnection.State == ConnectionState.Closed)
                {
                    dbConnection.Open();
                }
                inTransaction = true;
                isOpenTrans = dbConnection.BeginTransaction();
            }
            return isOpenTrans;
        }
        /// <summary>
        /// 提交事务
        /// </summary>
        public void Commit()
        {
            if (this.inTransaction)
            {
                this.inTransaction = false;
                this.isOpenTrans.Commit();
                this.Close();
            }
        }
        /// <summary>
        /// 回滚事务
        /// </summary>
        public void Rollback()
        {
            if (this.inTransaction)
            {
                this.inTransaction = false;
                this.isOpenTrans.Rollback();
                this.Close();
            }
        }
        /// <summary>
        /// 关闭数据库连接
        /// </summary>
        public void Close()
        {
            if (this.dbConnection != null)
            {
                this.dbConnection.Close();
                this.dbConnection.Dispose();
            }
            if (this.isOpenTrans != null)
            {
                this.isOpenTrans.Dispose();
            }
            this.dbConnection = null;
            this.isOpenTrans = null;
        }

View Code

 

继承接口IDatabase这没什么好说的,这是为了解耦数据层与业务逻辑层,这样就解决的两个类了

然后是看下Database第一个函数(构造函数)

/// <summary>
        /// 构造方法
        /// </summary>
        public Database(string connstring)
        {
            DbHelper dbhelper = new DbHelper(connstring);
        }

构造DbHelper类,

public DbHelper(string connstring)
        {
           //1,获取SQL链接语句
            ConnectionString = ConfigurationManager.ConnectionStrings[connstring].ConnectionString;
          //2,通过数据类型的枚举解析,定位到指定的SQL类型
            this.DatabaseTypeEnumParse(ConfigurationManager.ConnectionStrings[connstring].ProviderName);


/// <summary>
        /// 用于数据库类型的字符串枚举转换
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="value"></param>
        /// <returns></returns>
        public void DatabaseTypeEnumParse(string value)
        {
            try
            {
                switch (value)
                {
                    case "System.Data.SqlClient":
                        DbType = DatabaseType.SqlServer;
                        break;
                    case "System.Data.OracleClient":
                        DbType = DatabaseType.Oracle;
                        break;
                    case "MySql.Data.MySqlClient":
                        DbType = DatabaseType.MySql;
                        break;
                    case "System.Data.OleDb":
                        DbType = DatabaseType.Access;
                        break;
                    case "System.Data.SQLite":
                        DbType = DatabaseType.SQLite;
                        break;
                    default:
                        break;
                }
            }
            catch
            {
                throw new Exception("数据库类型\"" + value + "\"错误,请检查!");
            }
        }

View Code

 

//使用工厂创建相应的类型数据
            DbParmChar = DbFactory.CreateDbParmCharacter();
/// <summary>
        /// 根据配置文件中所配置的数据库类型
        /// 来获取命令参数中的参数符号oracle为":",sqlserver为"@"
        /// </summary>
        /// <returns></returns>
        public static string CreateDbParmCharacter()
        {
            string character = string.Empty;
            switch (DbHelper.DbType)
            {
                case DatabaseType.SqlServer:
                    character = "@";
                    break;
                case DatabaseType.Oracle:
                    character = ":";
                    break;
                case DatabaseType.MySql:
                    character = "?";
                    break;
                case DatabaseType.Access:
                    character = "@";
                    break;
                case DatabaseType.SQLite:
                    character = "@";
                    break;
                default:
                    throw new Exception("数据库类型目前不支持!");
            }
            return character;
        }

View Code

}

这样我们对程序有了初步的认识,这个框架支持各种SQL数据库,可以说的非常的强大。

然后是定义一些变量

/// <summary>
        /// 数据库连接对象
        /// </summary>
        private DbConnection dbConnection { get; set; }
        /// <summary>
        /// 事务对象
        /// </summary>
        private DbTransaction isOpenTrans { get; set; }
        /// <summary>
        /// 是否已在事务之中
        /// </summary>
        public bool inTransaction { get; set; }

三个对象:

首先解释一下什么是事务,事务简单理解就是,完整的一件事,要么成,要么不成只有这两个结果,如果不成的数据库会回滚,回复到原来的样子

/// <summary>
        /// 事务开始
        /// </summary>
        /// <returns></returns>
        public DbTransaction BeginTrans()
        {
            //首先判断事务是否忙,
            if (!this.inTransaction)
            {
                 //获取数据库连接语句,这个是从上面的工厂来的
                 //这句话分两步解析1,首先是DbHelper.ConnectionString,DbHelper在Database构造函数是已经给DbHelper的ConnectionString赋值了,这句: ConnectionString = ConfigurationManager.ConnectionStrings[connstring].ConnectionString;
//2,DbFactory.CreateDbConnection()通过数据库对象创建相应的数据对象,以适应不同的数据库
/// <summary>
        /// 根据配置文件中所配置的数据库类型和传入的
        /// 数据库链接字符串来创建相应数据库连接对象
        /// </summary>
        /// <param name="connectionString"></param>
        /// <returns></returns>
        public static DbConnection CreateDbConnection(string connectionString)
        {
            DbConnection conn = null;
            switch (DbHelper.DbType)
            {
                case DatabaseType.SqlServer:
                    conn = new SqlConnection(connectionString);
                    break;
                case DatabaseType.Oracle:
                    conn = new OracleConnection(connectionString);
                    break;
                case DatabaseType.MySql:
                    conn = new MySqlConnection(connectionString);
                    break;
                case DatabaseType.Access:
                    conn = new OleDbConnection(connectionString);
                    break;
                case DatabaseType.SQLite:
                    conn = new SQLiteConnection(connectionString);
                    break;
                default:
                    throw new Exception("数据库类型目前不支持!");
            }
            return conn;
        }

View Code

dbConnection = DbFactory.CreateDbConnection(DbHelper.ConnectionString);
                //上面的两句说得那么多其实就是构造数据库连接语句而已
                if (dbConnection.State == ConnectionState.Closed)
                {
                    dbConnection.Open();
                }
          //使用标记位标记为忙,在事务开始时,对数据库的链接加了把锁,直到事务结束(提交或回滚)时解开锁如下
/// <summary>
        /// 提交事务
        /// </summary>
        public void Commit()
        {
            if (this.inTransaction)
            {
                this.inTransaction = false;
                this.isOpenTrans.Commit();
                this.Close();
            }
        }

View Code

inTransaction = true;
                //设置完属性后就能开始事务了,dbConnect是DbConnect声明的
https://msdn.microsoft.com/zh-cn/library/system.data.common.dbconnection.aspx来自这里大家可以看看
isOpenTrans = dbConnection.BeginTransaction();
            }
            return isOpenTrans;
        }

 这样一个事务就可以开始了;

总结下:事务的开始要三个条件1,数据库连接字符串,就像这样“Data Source=.;database = kskf;Integrated security = true”

                                        2,数据库对象,即链接哪个数据库,MSSQL,MYSQl等等,这个东西是这么来确定的呢?留点悬链下次来

                                        3,使用DbConnect开始事务的连接

好吧这次就到这里有点啰嗦了,关键是这个架构有点复杂,还有“欲知后事,且听下回分解!”