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