看完了传智播客的视频后,因为还有时间就想着做点什么项目,网上买了一个.net程序,力软公司的做得相当完善。
框架链接:
下面我们来谈谈框架:
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;
}
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开始事务的连接
好吧这次就到这里有点啰嗦了,关键是这个架构有点复杂,还有“欲知后事,且听下回分解!”