Winform开发框架之动态指定数据表

在Winform开发框架的应用中,大多数的时候,我们都是采用固定的表名作为操作数据表的对象,但有时候,有些特殊的需要,需要动态指定表的名称,如表名称可能和年份有关系或者和登录用户的身份有关系等等。本文介绍基于我的Winform开发框架,介绍如何动态构造表名,实现向不同表获取数据的操作实现。

例如:数据库中有一些客户信息的表(Customer),按照年份存储,都是Customer2012这样格式的表,每次调用的时候需要告诉Customer业务对象实际上去访问哪个Customer的表,比如Customer2012或者Customer2013,那么我们应该如何操作才能达到这种效果呢?

首先我们来了解下整个Winform开发框架的分层布局如下所示。其中界面层UI直接访问BLL层,不需要通过网络(WCF开发框架通过网络访问数据),其中公用辅助类库Common层、实体类层可以在各个层中访问,并把常用的权限管理、字典管理封装为组件模块,直接调用,底层则使用工厂方式,来支持各种不同的数据库,其中UI层、BLL层、DAL层、实体层均使用继承类方式实现最良好的封装、最优的代码设计。

业务访问层的设计图如下所示。

数据访问层的设计如下所示。

由于基类的封装良好性,以及利用泛型获得强类型的操作体验,减少出错,更加方便易用,在扩展上也更加高效快捷。

综上所述,为了实现动态表名的操作,我们只需要扩展三个类即可实现,第一个是BaseBLL业务层基类,提供给接口给界面进行调用;第二个是IBaseDAL,提供数据访问层接口进行调用,第三个是在AbstractBaseDAL基类中实现修改数据表的接口即可。下面我们来看具体的代码分析。

1)在BaseBLL增加InitTableName函数的实现。

    public class BaseBLL<T> where T : BaseEntity, new()
    {
        #region 构造函数

        private string dalName = "";
        protected IBaseDAL<T> baseDal = null;

        public BaseBLL() : this("")
        {
        }

        public BaseBLL(string dalName)
        {
            .......................

            baseDal = Reflect<IBaseDAL<T>>.Create(this.dalName, Assembly.GetExecutingAssembly().GetName().Name);
        } 

        #endregion        

        /// <summary>
        /// 初始化数据库表名
        /// </summary>
        /// <param name="tableName">数据库表名</param>
        public void InitTableName(string tableName)
        {
            baseDal.InitTableName(tableName);
        }
    }

2)在IBaseDAL中增加接口定义

    /// <summary>
    /// 数据访问层接口
    /// </summary>
    public interface IBaseDAL<T> where T : BaseEntity
    {
        //其他接口定义
        .............................

        /// <summary>
        /// 初始化数据库表名
        /// </summary>
        /// <param name="tableName">数据库表名</param>
        void InitTableName(string tableName);
    }        

3)在AbstractBaseDAL数据访问基类中实现InitTableName接口。

    /// <summary>
    /// 数据访问层的基类
    /// </summary>
    public abstract class AbstractBaseDAL<T> where T : BaseEntity, new()
    {
        protected string tableName;//需要初始化的对象表名
        protected string primaryKey;//数据库的主键字段名
        protected string sortField;//排序字段

        public AbstractBaseDAL()
        {}

        /// <summary>
        /// 指定表名以及主键,对基类进构造
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="primaryKey">表主键</param>
        public AbstractBaseDAL(string tableName, string primaryKey)
        {
            this.tableName = tableName;
            this.primaryKey = primaryKey;
            this.sortField = primaryKey;//默认为主键排序
        }

        //省略其他代码
        ..............................

        /// <summary>
        /// 初始化数据库表名
        /// </summary>
        /// <param name="tableName">数据库表名</param>
        public void InitTableName(string tableName)
        {
            this.tableName = tableName;
        }
    }

4)界面层调用代码

以数据字典操作为例,我们动态指定表名可以调用下面代码,如下所示。

        private void btnTest_Click(object sender, EventArgs e)
        {
            BLLFactory<DictType>.Instance.InitTableName("tb_DictType");
            List<DictTypeInfo> list = BLLFactory<DictType>.Instance.GetAll();
        }

以上就是动态表名在我的WInform开发框架中的实现扩展,虽然这个实现不算复杂,但是可以从中了解Winform开发框架的业务对象的调用过程,以及看到基类对象扩展的方便性和高效性。

由于底层的对象良好封装,在我们实际开发过程中,大多数情况下,不用编写额外的数据访问代码,对于界面及整体框架的代码,也有代码生成工具Database2Sharp能够实现快速的框架代码以及界面代码(包括Winform、Web界面代码)的生成,以此从根本上提高开发的效率,减少出错的机会,统一整体框架的代码风格,实现更加健壮的开发应用。

本文转自博客园伍华聪的博客,原文链接:Winform开发框架之动态指定数据表,如需转载请自行联系原博主。

时间: 2024-10-24 18:09:58

Winform开发框架之动态指定数据表的相关文章

WinForm 开发框架【动态读取DLL模式】

之前的那个开发框架好几个朋友都用在了项目里面,也给我提出了很宝贵的意见,虽然最近一直没有什么更新,但是针对朋友们提出的建议,我都仔细考虑了一翻,很多的意见我都融入了系统里面,将不足之处修改过来,本来想把报表的事儿给搞定,但是想了几种方案结果都不了了之.曾经有一个朋友说很欣赏我那个读取DLL文件的框架,以前我觉得写得挺乱的,代码也是比较混乱,有时候我自己翻出来居然要想很久才知道那些代码是什么意思,当时之所以舍弃了这套框架,是因为觉得整个项目的Size会越来越大,因为每一个窗体都是一个类库,然后编译

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

在我们开发工作流的时候,往往需要设计到具体业务表单信息的编辑,有些是采用动态编辑的,有些则是在开发过程中处理的,各有各的优点,动态编辑的则方便维护各种各样的表单,但是数据的绑定及处理则比较麻烦,而自定义开发的,则数据弹性很大,方便修改调整.本篇随笔基于表单的开发设计过程,介绍在工作流中如何新增一个业务表单,以便快速的实现审批业务的上线处理. 1.业务表单的基类继承 首先我们来了解一下业务表单的对应关系,一般创建一个业务流程处理,都需要有一个具体的创建业务表单的界面,以及一个查看处理表单的界面.

Winform开发框架之通用定时服务管理2---如何开发定时服务应用

在上篇随笔<Winform开发框架之通用定时服务管理>介绍了我的框架体系中,通用定时服务管理模块的设计以及一些相关功能的展示.我们在做项目的时候,或多或少需要和其他外部系统或者接口进行数据交互,有些是单向的获取,有些是双向的操作.这个定时操作(可能是间隔的时间,也可以能是定在某一个时刻,也可以能是让它在某天某时刻运行),那么这就需要定时服务程序来管理了,通常我们把他寄宿在Windows服务里面(这也是一种最佳的方式),这种方式最好的地方,就是它的生命周期可以随着电脑的启动而启动,而且很少需要用

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

在我们开发工作流模块的时候,有时候填写申请单过程中,暂时不想提交审批,那么可以暂存为草稿,以供下次继续填写或者提交处理,那么这个草稿的功能是比较实用的,否则对于一些填写内容比较多的申请单,每次要重填写很多数据,那会被用户骂的,从用户的角度上来讲,提供草稿保存的功能是比较友好的.本篇随笔介绍在工作流模块中使用一种通用的存储方式来存储及显示申请单草稿的信息. 1.申请单填写 在我们提交申请前,我们一般是需要填写一些相关的资料,如下界面所示. 这个表单记录的信息不多,不过提供存为草稿的功能也是要的,我

Winform开发框架中工作流模块之审批会签操作

在前面介绍了框架中工作流的几个开发过程,本篇随笔重点介绍一下日常审批环节中的具体处理过程,从开始创建表单,以及各个审批.会签过程的流转过程,希望大家对其中流程的处理有一个大概的印象. 1.请假申请表单 这里介绍的具体功能,是在业务表单已经完成好,具体的使用过程,我们以请假申请单为例,在我们创建对应的流程步骤如下所示后, 我们就可以开始创建具体的业务审批流程了,在业务受理列表里面选择对应的请假申请,弹出相应的创建业务流程表单窗体. 单击[发送]按钮,会要求选择下一步的审批人,如下所示.  这样对应

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

前面随笔介绍了请假申请单和报销申请单两个不同的业务表单的流程处理,一个是单表信息,一个包含明细的主从表信息,后者包含了条件流程的处理,在流程审批中,一般还有一种流程处理就是会签的操作,会签处理是几个审批步骤中审批人同时处理是否通过的,一般同时通过即为通过.本篇随笔介绍工作流中的会签处理过程. 1.会签流程定义 会签是指创建一个或多个子流程供相关人员进行审批,等待全部人员完成处理后再次回到主流程上,然后决定是否继续流转到下一个流程步骤上去,一般的申请单的主流程如下所示. 这里设置的会签处理就是其中

Winform开发框架之框架演化

国庆去了一趟北京,回来一直忙着各种各样的事情,有公司的,有个人的,就没停过来,所以很久没有写博客了,写博客要有一个好的心情及一个好的思路,否则宁愿不写,这是我的准则.虽然这段时间没有写博客分享各种经验,不过一直还在做一些框架相关的事情,很多东西沉淀下来,慢慢有空就继续分享,与大家做一些探讨研究了. Winform开发框架方面的文章我介绍很多了,有宏观介绍,也有部分技术细节的交流,每次我希望能从不同角度,不同方面来介绍我的WInform开发框架,这些其实都是来源于客户的需求,真实的项目场景.本文主

mysql中数据库与数据表编码格式的查看、创建及修改_Mysql

一.查看数据库编码格式 mysql> show variables like 'character_set_database'; 二.查看数据表的编码格式 mysql> show create table <表名>; 三.创建数据库时指定数据库的字符集 mysql>create database <数据库名> character set utf8; 四.创建数据表时指定数据表的编码格式 create table tb_books ( name varchar(45

Winform开发框架之权限管理系统改进的经验总结(4)-一行代码实现表操作日志记录

在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代码实现重要表的操作日志记录.我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加.修改.删除等关键的操作,如果能在框架层面的支持基础上,以最少的代码实现重要表的日志记录,那么是一件非常值得庆贺的事情,也能够为我们客户的数据提供重要的日志跟踪,甚至是数据恢复的参考. 1.数据访问层的对象继承关系 首先,为了减少重复代码的编写,合理的继承关系是必要的,我们需要在数据访问层上建立合理的继承关系,如下是我的