问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

我想用winform开发一个基于c/s架构的数据库管理系统

发布网友 发布时间:2022-04-07 17:40

我来回答

2个回答

懂视网 时间:2022-04-07 22:02

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

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

 

Winform开发框架中实现同时兼容多种数据库类型处理

标签:

热心网友 时间:2022-04-07 19:10

可以的,MVC确实是在B/S架构下提出的一种框架结构,其核心思想是将表现层和业务逻辑层分开,一方面能够提高响应速度,另一方面方便代码维护,在C/S架构下,可能就要简化一下了,也就是只有M、V两层,C(控制层)在C/S架构下可能会增加代码的复杂度
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么一些男性喜欢要求伴侣叫自己爸爸? proteus8中怎么放置引脚标号 ...在proteus里不知道用什么表示?有没有什么proteus中专门的中英文对照... 甜蜜家园郑毅铭是什么身份 甜蜜家园第二季郑毅铭喜欢谁 瑞梦喜智能空调床垫适合人群 小孩可以用智能床垫吗 智能床垫适合哪些人用 我父亲今年59岁,有高血压和颈椎病的病史,最近一段时间感觉一躺下就偏... ...刚从医院治疗回来。我想买个枕头给他,不知买怎样的比较好?_百度知 ... 有什么正规的外汇平台吗 韩束墨菊深度补水六件组的正确使用顺序是什么? 化妆水、精华、乳液的涂抹顺序?间隔需要多久啊? icp许可证办理所需要的申请材料 微信取什么名字浪漫 起个微信名字诗意一点,浪漫一点 我的被封 了,怎么登都登不上,怎么办? 我的被封了怎么办啊? 我的被封了,要怎么解封? 被封了,我试解封多次,还是失败了,怎么办? 我的被腾讯封了怎么办? 清晨,太阳刚刚升起,湖面上飘着薄薄的雾。天边的晨星和山上的点点灯光,隐隐约约地倒映在湖水中。这段话 我的被封了,怎么办? 我的被封了,怎么办? 有哪些字是形容日出光亮,太阳刚刚升起的样子? 被永久封了怎么办? 我的被永久封号了,怎么办? 我被封了,登不上去如何解封? 我的被封 了,怎么登都登不上,怎么办? 谁知道“短视频工作开展计划”怎么写? 定州东站公交几点下班 办理ICP许可证,需要提交哪些材料? 草莓能和豆浆一起榨成果汁吗? 你认为赚钱难吗?现在赚钱的主要方式是什么? 农村信用合作社原始股是什么意思 农村信用社原始股还能参加分红吗 草莓和什么水果一起榨果汁会起到美白的作用? 求教:农村信用社的投资股是原始股吗? 农村信用社的原始股怎么购买?可信吗? 现在什么最好赚钱 农村信用社的原始股怎么购买 农村信用社的原始股应该购买吗 中国农村信用社股票多少钱一股 农村信用社原始股 强退? 请高手帮我看下这款是海康威视什么型号的摄像头?这摄像头超级大比人脑袋都大,查查有什么功能?谢谢! 农村信用社原始股要交给银监会管理,是好事吗? 八十年代创建农村信用社的原始股票值多少? 谁有中国舞蹈家协会的教材?音乐也可以,要很清晰的!网上下载的视频里音乐都很不清楚啊!!! broway博而美家用灯具有视频监控吗 摩尔庄园那些红的嘟噜噜去哪抓? 早晨太阳刚升起的美句