/// <summary> /// 数据访问层的超级基类,所有数据库的数据访问基类都继承自这个超级基类,包括Oracle、SqlServer、Sqlite、MySql、Access等 /// </summary> public abstract class AbstractBaseDAL<T> where T : BaseEntity, new () { /// <summary> /// 设置数据库配置项名称 /// </summary> /// <param name="dbConfigName"> 数据库配置项名称 </param> public virtual void SetDbConfigName( string dbConfigName) { this .dbConfigName = dbConfigName; } .................... }
那么我们这次只需要在这个基础上调整一下就可以实现同一时刻变换不同数据库支持的了,由于在框架里面,我们一般已经实现了多种数据库访问的逻辑(如下所示),因此切换起来访问肯定也是没问题的(保证有数据库即可)。
方法就是在BLL层里面添加一个公开方法,可以设置配置项和数据库类型的函数,如下所示。
/// <summary> /// 根据参数信息,重新初始化数据访问层(例:可以指定不同的数据访问层) /// </summary> /// <param name="dbConfigName"> 数据库配置项名称 </param> /// <param name="componentDbType"> 数据库类型,默认从ComponentDbType中读取,如果dbConfigName指定不同类型的数据库连接,需要指定componentDbType。 </param> public void SetConfigName( string dbConfigName, string componentDbType = null ) { // componentDbType = null时,从配置项取ComponentDbType的值 string dbType = componentDbType; if ( string .IsNullOrEmpty(componentDbType)) { AppConfig config = new AppConfig(); dbType = config.AppConfigGet( " ComponentDbType " ); } string DALPrefix = GetDALPrefix(dbType); this .dalName = bllFullName.Replace(bllPrefix, DALPrefix); // 替换中级的BLL.为DAL.,就是DAL类的全名 baseDal = Reflect<IBaseDAL<T>>.Create( this .dalName, dalAssemblyName); // 构造对应的DAL数据访问层的对象类 if (! string .IsNullOrEmpty(dbConfigName)) { baseDal.SetDbConfigName(dbConfigName); // 设置数据库配置项名称 } }
这样我们除了可以设置EnterpriseLibrary的配置项外,还可以指定这个数据库的类型,不需要全部使用统一的ComponentDbType的值。
如下代码处理,我们就可以在访问其他数据库的时候,切换这个BLL层的对象为其他类型的数据库(SQLite),这样不管其他类如何变化,这个Province的数据访问的是SQLite数据库里面的数据。
BLLFactory<Province>.Instance.SetConfig( " sqlite " , " sqlite " );
2、支持多数据库操作的基类CommonDAL,实现不同数据库访问
有时候,我们在一个比较小的应用程序里面,想灵活对数据库表进行一些简单的处理操作,不想使用代码生成工具生成整个架构的代码,那么这个时候,这个CommonDAL就派上用场了,这个可以快速访问数据库的表,它的定义如下所示。
这个类的几个构造函数如下所示,参数分别为表名,主键字段,数据库类型。
/// <summary> /// 默认构造函数 /// </summary> public CommonDAL() { } /// <summary> /// 指定表名以及主键,对基类进构造 /// </summary> /// <param name="tableName"> 表名 </param> /// <param name="primaryKey"> 表主键 </param> /// <param name="dbType"> 数据库类型,如果为空从配置文件里面获取ComponentDbType的键值 </param> public CommonDAL( string tableName) : this (tableName, null , null ) { } /// <summary> /// 指定表名以及主键,对基类进构造 /// </summary> /// <param name="tableName"> 表名 </param> /// <param name="primaryKey"> 表主键 </param> /// <param name="dbType"> 数据库类型,如果为空从配置文件里面获取ComponentDbType的键值 </param> public CommonDAL( string tableName, string primaryKey, string dbType = null ) : this () { }
这个就是一个精简版本的AbstractBaseDAL基类,提供了我们能够使用的多数数据库操作方法。
例如我在一个验证视图及其格式的例子程序里面,就使用了这个类来实现快速的数据库操作处理。
/// <summary> /// 判断视图名称是否存在的任务 /// </summary> public class ViewNameExistJob : IExecuteJob { public bool Execute() { List < string > list = DataHelper.GetViewList(); bool allSuccess = true ; foreach ( string view in list) { CommonDb dal = new CommonDb(view, " F_Guid " ); try { DataTable dt = dal.GetReaderSchema(view); } catch (Exception ex) { allSuccess = false ; LogTextHelper.Error( string .Format( " 视图:{0}不存在。{1} " , view, ex.Message)); } } if (allSuccess) { LogTextHelper.Info( " 视图全部存在。 " ); } return allSuccess; } }
或者其他数据库访问处理。
CommonDb dal = new CommonDb(view, " F_Guid " ); try { int count = dal.GetRecordCount(); if (count == 0 ) { LogTextHelper.Info( string .Format( " 视图【{0}】数据为空,请检查! " , view)); allSuccess = false ; } } catch (Exception ex) { allSuccess = false ; LogTextHelper.Error( string .Format( " 视图:【{0}】不存在。{1} " , view, ex.Message)); }
这样也可以实现多数据库的随便切换,不过这个是用于简易的数据库访问,对于需要多种业务封装的处理类,我们还是使用常规的框架分层模式来实现数据的处理操作。
Winform开发框架中实现同时兼容多种数据库类型处理
标签:
查看更多关于Winform开发框架中实现同时兼容多种数据库类型处理的详细内容...