在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适应性和强壮型。还有一种情况,由于业务数据库的不断膨胀或者方便数据库的切割隔离,有时候也会把不同的业务数据库进行分拆,如权限提供数据库,客户关系管理数据库,工作流程数据库,企业营运数据库等等,因此在一个系统里面,同时使用2个或者以上的数据库的情况也是有的。

在我较早期的一篇随笔《Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持》里面,介绍了框架如何在一个项目里支持多个数据库的拆分处理。一般情况下,我们都是在一个数据库类型的情况下,分拆多个数据库,但是也有变态的需求例外,如我们可能把一些常规的数据库存储在本地SQLite数据库里面,其他的一些数据放在局域网其他类型数据库(如SQLServer)里面;那么这种同一时刻支持多种数据库类型,并且给用户创建BLL层类的时候,动态指定数据库是否可以实现的呢?

当然可以,我们在上面的基础上稍微调整一下创建方法即可。

1、同时支持多种类型数据库处理并存

之前介绍了,需要分拆数据库的话,我们需要在数据访问基类AbstractBaseDAL里面,添加一个SetConfigName的方法,用来指定具体的数据库配置项目,如下所示。

    /// <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 == )
{
LogTextHelper.Info(string.Format("视图【{0}】数据为空,请检查!", view));
allSuccess = false;
}
}
catch (Exception ex)
{
allSuccess = false;
LogTextHelper.Error(string.Format("视图:【{0}】不存在。{1}", view, ex.Message));
}

这样也可以实现多数据库的随便切换,不过这个是用于简易的数据库访问,对于需要多种业务封装的处理类,我们还是使用常规的框架分层模式来实现数据的处理操作。

Winform开发框架中实现同时兼容多种数据库类型处理的更多相关文章

  1. 基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

    由于一个客户朋友的需求,需要我的Winform开发框架支持国产达梦数据库的操作,这个数据库很早就听过,但是真正一般项目用的很少,一般在一些特殊的项目可能需要用到.由于我的Winform开发框架,是基于 ...

  2. 参照企业微信审批业务,在Winform开发框架中工作流模块的实现业务审批

    目前微信的企业号已经切换到企业微信里面,这个是一个APP程序,提供了很丰富的企业应用,其中包括了业务审批处理,审批业务包括请假.报销.费用.出差等很多个审批场景,在Winform开发框架中工作流模块这 ...

  3. Winform开发框架中工作流模块的业务表单开发

    在我们开发工作流的时候,往往需要设计到具体业务表单信息的编辑,有些是采用动态编辑的,有些则是在开发过程中处理的,各有各的优点,动态编辑的则方便维护各种各样的表单,但是数据的绑定及处理则比较麻烦,而自定 ...

  4. 使用Dapper.Contrib 开发.net core程序,兼容多种数据库

    关于Dapper的介绍,我想很多人都对它有一定的了解,这个类似一个轻型的ORM框架是目前应用非常火的一个东西,据说各方面的性能都不错,而且可以支持多种数据库,在开始介绍这个文章之前,我花了不少功夫来学 ...

  5. SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型

    SQL 横转竖 .竖专横 (转载)   普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...

  6. Dapper.Contrib 开发.net core程序,兼容多种数据库

    Dapper.Contrib 开发.net core程序,兼容多种数据库 https://www.cnblogs.com/wuhuacong/p/9952900.html 使用Dapper.Contr ...

  7. 在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择

    在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的WInform开发框架中,这样后面开发项目起来,就可以节省很多研究时间,并能重复使用,非常高效方便.在我很早之前的一篇博客& ...

  8. Winform开发框架中工作流模块之申请单草稿处理

    在我们开发工作流模块的时候,有时候填写申请单过程中,暂时不想提交审批,那么可以暂存为草稿,以供下次继续填写或者提交处理,那么这个草稿的功能是比较实用的,否则对于一些填写内容比较多的申请单,每次要重填写 ...

  9. Winform开发框架中工作流模块之审批会签操作(2)

    前面随笔介绍了请假申请单和报销申请单两个不同的业务表单的流程处理,一个是单表信息,一个包含明细的主从表信息,后者包含了条件流程的处理,在流程审批中,一般还有一种流程处理就是会签的操作,会签处理是几个审 ...

随机推荐

  1. hadoop学习笔记:zookeeper学习(上)

    在前面的文章里我多次提到zookeeper对于分布式系统开发的重要性,因此对zookeeper的学习是非常必要的.本篇博文主要是讲解zookeeper的安装和zookeeper的一些基本的应用,同时我 ...

  2. 十进制数转化成二进制后包含一的数量(c++)

    #include <iostream> using namespace std;int func(int x){    int count=0;    while(x){          ...

  3. Linux 循环

    200 ? "200px" : this.width)!important;} --> 简介 if循环 if conditon then commandselse comma ...

  4. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

  5. Flyway, 数据库Schema管理利器

    整天跟数据库打交道的程序员都知道,当数据库的Schema发生改变时是多么痛苦的事情.尤其是一个在不断开发完善的项目,随着需求变化,数据库的schema也会跟着变化,而追踪记录这些变化一向都是费时费力. ...

  6. Linux网络编程系列-TCP传输控制

    滑动窗口(sliding window) 滑动窗口是用于流量控制的,发送端根据接收端的处理能力发送数据,不至于造成过多的丢包. 是发送方和接收方间的协调,对方的接收窗口大小就是自己的发送窗口大小. 在 ...

  7. iOS给图片添加滤镜&使用openGLES动态渲染图片

    给图片增加滤镜有这两种方式: CoreImage / openGLES 下面先说明如何使用CoreImage给图片添加滤镜, 主要为以下步骤: #1.导入CIImage格式的原始图片 #2.创建CIF ...

  8. 《机器学习实战》 code debug

    摘要:最近在看<机器学习实战>,在code的过程中总是会报一些小错误,所以发下debug过的地方:由于是跳着看的,所以只是其中一部分,希望之后能把这本书我遇见的全部错误都在此更正下. 内容 ...

  9. MVVM架构~knockoutjs与MVC配合,实现列表的增删改功能

    返回目录 MVC与MVVM的模型 在MVC实例项目中,为我们提供了简单的增删改查功能,而这种功能的实现与具体的Model很有关系,或者说它与后台数据库的关系过于紧密了,而对于开发人员来说当页面布局修改 ...

  10. MVVM架构~knockoutjs系列之为validation.js扩展minLength和maxLength

    返回目录 为什么要对minLength和maxLength这两个方法进行扩展呢,是因为这样一个需求,在用户注册时,可以由用户自己决定他们输入的字符,中文,英文,数字均可,这样做了之后,使用户的体验更好 ...