X软框架之我见——SQL三层MVC架构(1)
看完了传智播客的视频后,因为还有时间就想着做点什么项目,网上买了一个.net程序,力软公司的做得相当完善。
框架链接: http://download.csdn.net/detail/quankangquan/9632086
下面我们来谈谈框架:
1,首先是Dal层

抽出最主要的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; }
继承接口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 + "\"错误,请检查!"); } }
//使用工厂创建相应的类型数据 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; }
}
这样我们对程序有了初步的认识,这个框架支持各种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; }
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(); } }
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开始事务的连接
好吧这次就到这里有点啰嗦了,关键是这个架构有点复杂,还有“欲知后事,且听下回分解!”

浙公网安备 33010602011771号