前言

那两日微微着凉状态,除了从前折腾 乐乎观众天使 腾到三更,近来也在折磨个别工具到四更,偶尔心来心潮,赶紧写写文章,最近有广大情人对CYQ.Data V5里的公文数据库感兴趣,那里就给大伙儿说下文件数据库技术原理,给大伙解下密。

 

 

CYQ.Data 框架的多福多寿与发展:

CYQ.Data
对于V4文山会海,版本号就在V4.55版本就不再升高了,首假设为着保存3个最稳定的本子,基本除了Bug校订,不会再有超越V4.N的版本号出现了。

而V5版本,这一两年来,事实上,代码改动十分的大,内部类的结构也调动不少,由于效果的新扩张导致和改动,被记录的就有四五十项,没记录的数不清了,然则V5在各档次中沉淀了也近一年了,稳定性也很强。

 

CYQ.Data 文本数据库:

先前写过有关的稿子:周末一同用文件数据库玩玩Code
First

对此文本数据库的使用,在本来的 OAuth2
登陆组件
,就利用上了,用户存款和储蓄AccessToken和呼应账号,不知情大家注意到了从未有过。 

那里自身再举今日发表的 CYQ.Data.ProjectTool
项目安顿工具发表(包源码)
,保存用户配置的也是文件数据库。

 

CYQ.Data 文本数据库技术原理:

先看图片:

 json 1

 

简易工程描述:

在那个类型中,首倘若读取表结构,然后生成对应的枚举类,或实体类,同时须求保留用户的配置,依据安插名称,允许保留四个布局项,而且每一遍开启,要求还原用户最新的安顿项。

 

用什么样来保存配置?

在从前,作者用了App.config来保存配置,当然也能够用Xml,ini文件,可是,代码写起来都相对比较费力,人总是在运用一些东西觉的横祸麻烦的时候,就会出一种方案来消除它们,所以,文本数据库就是如此一种简单的方案。

 

下边用源码里的局地代码片断来解密文件数据库的本质:

 

以此大致的工程,事实包蕴了数据库基本的增加和删除改查操作:

1:添加用户配置。

2:同配置名,更新用户配置。

3:删除用户配置(猜度被笔者忘掉了,没拉长那成效)

4:从有着配置中,查询出被标识为IsMain=true的数额,并还原为暗许配置。

花色里建了多少个ProjectConfig实体类,来个CodeFirst:

json 2

那实体多了3个OOdysseyM继承,让它抱有OTiguanM的底子意义:

构造函数要钦点表名和数据库链接(能够是陈设名,内部判断的依照是有没有空格,没空格则到web.config取,有空格当成链接)

 

实体类代码如下:

json 3json 4CYQ.Data.ProjectTool

namespace CYQ.Data.ProjectTool
{
    public class ProjectConfig : CYQ.Data.Orm.OrmBase
    {
        public ProjectConfig()
        {
            base.SetInit(this, “ProjectConfig”, “Txt Path={0}”);
        }
        private int _ID;
        /// <summary>
        /// 标识
        /// </summary>
        public int ID
        {
            get
            {
                return _ID;
            }
            set
            {
                _ID = value;
            }
        }
        private string _Name;
        /// <summary>
        /// 配置名称
        /// </summary>
        public string Name
        {
            get
            {
                return _Name;
            }
            set
            {
                _Name = value;
            }
        }

        private string _Conn;
        /// <summary>
        /// 链接字符串
        /// </summary>
        public string Conn
        {
            get
            {
                return _Conn;
            }
            set
            {
                _Conn = value;
            }
        }

        private string _DBType;
        /// <summary>
        /// 数据库类型
        /// </summary>
        public string DBType
        {
            get
            {
                return _DBType;
            }
            set
            {
                _DBType = value;
            }
        }

        private bool _MutilDatabase;
        /// <summary>
        /// 帮忙多数据库格局
        /// </summary>
        public bool MutilDatabase
        {
            get
            {
                return _MutilDatabase;
            }
            set
            {
                _MutilDatabase = value;
            }
        }
        private string _ProjectPath;

        public string ProjectPath
        {
            get
            {
                return _ProjectPath;
            }
            set
            {
                _ProjectPath = value;
            }
        }
        private bool _IsMain;

        public bool IsMain
        {
            get
            {
                return _IsMain;
            }
            set
            {
                _IsMain = value;
            }
        }
        private string _BuildMode;
        /// <summary>
        /// 创设格局(枚举方式;OXC60M实体类形式)
        /// </summary>
        public string BuildMode
        {
            get
            {
                return _BuildMode;
            }
            set
            {
                _BuildMode = value;
            }
        }
        private string _NameSpace;
        /// <summary>
        /// 默许的称号空间
        /// </summary>
        public string NameSpace
        {
            get
            {
                return _NameSpace;
            }
            set
            {
                _NameSpace = value;
            }
        }

    }

PS:倘使你数据库链接从Txt Path改成Xml
帕特h,你会发现,存款和储蓄的格式化为Xml。

看一段扩大安顿的代码片断:

在用户点击“测试链接”或“生成文书”时,假若检查和测试到链接是打响的,则自动保存当前配备音讯,代码如下:

string SaveConfig()        

{
            string name = ddlName.Text.Trim();
            if (string.IsNullOrEmpty(name))
            {
                name = “DefaultConn”;
            }
            ResetMainState();
            using (ProjectConfig config = new ProjectConfig())
            {
                config.SetAutoParentControl(gbConn, gbBuild);

                if (config.Fill(“Name='” + name + “‘”))
                {
                    config.IsMain = true;
                    config.Update(null, true);
                }
                else
                {
                    config.IsMain = true;
                    if (config.Insert(true))
                    {
                        ddlName.Items.Add(name);
                    }
                }
            }
            return name;
        }

 

探望实体类New的这一行代码:

 using (ProjectConfig config = new ProjectConfig())

 

using 语法:

不多解释了,甘休的时候,它自动会调用disponse方法,自动关闭并释放相关能源。 

 

构造函数New初叶化:

系统会收获实体类上的习性成员,组成三个表结构,然后写到数据库链接里钦命的途径。

你运维软件后,会自动发下在钦命的目录下多了二个文书:ProjectConfig.ts

 

内部储存了表的布局,内容如下:

ID,Int,False,False,0,;

Name,NVarChar,False,True,0,;

Conn,NVarChar,False,True,0,;

DBType,NVarChar,False,True,0,;

MutilDatabase,Bit,False,True,0,;

ProjectPath,NVarChar,False,True,0,;

IsMain,Bit,False,True,0,;

BuildMode,NVarChar,False,True,0,;

NameSpace,NVarChar,False,True,0,; 

 

简单易行表达:

表结构存款和储蓄格式为:名称,类型,允许为空,是还是不是只读,长度,默许值。

对此文本数据库,就是创建了“表名.ts”,假设是其余数据库链接,就会一向在数据库成立相应的表。

 

末端的性质赋值,和OMuranoM的基础操作方法,大家差不离略过:

此间运用和UI结合的主意取值:config.SetAutoParentControl(gbConn,
gbBuild);

自行多三个GroupBox里的子控件里取值。

而IsMain属性,是不在控件里涌出的,所以必要单独赋值。

 

通过和UI结合,在恢复生机配置项的时候,也只要一句SetToAll(),就解决了:

源码里有诸如此类一段代码,依照安排名,还原全数配置,看一眼就能够了:

 void LoadConfig(string name)
        {
            if (!string.IsNullOrEmpty(name))
            {
                using (ProjectConfig config = new ProjectConfig())
                {
                    if (config.Fill(“Name='” + name + “‘”))
                    {
                        config.SetToAll(gbConn, gbBuild);
                    }
                }
            }
        }

对此文本数据库,刚才只是说自动生成了表结构,存款和储蓄为“*.ts”文件了。

 

对于数据的仓库储存吗?

 

CYQ.Data 对于本文数据库而言,有八个宗旨类:

1:JsonHelper:和Json打交道的类。

2:MDataTalle:内部存款和储蓄器表,功效很强大,具备和Json或Xml加载与出口的成效。 

 

文件数据库的完成,正是基于这几个四个类。

在储存时,即便有三个文本,则是四个Static MDataTable

由此MDataTable与Json(或Xml)的相互,加载与输入来兑现。

 

从而若运营后,基本得以观察那几个文件:ProjectConfig.txt,里面储存着json文件如下:

 

{“ID”:”System.Int32″,”Name”:”System.String”,”Conn”:”System.String”,”DBType”:”System.String”,”MutilDatabase”:”System.Boolean”,”ProjectPath”:”System.String”,”IsMain”:”System.Boolean”,”BuildMode”:”System.String”,”NameSpace”:”System.String”},
{“ID”:”1″,”Name”:”DefaultConn”,”Conn”:”server=.;database=qblog;uid=sa;pwd=123456″,”DBType”:”Mssql”,”MutilDatabase”:”False”,”ProjectPath”:””,”IsMain”:”True”,”BuildMode”:”实体型(O翼虎M操作情势)”,”NameSpace”:”Web.Entity”}

 

大致表达:

第②行,遵照有些处境,大概存款和储蓄数据类型,那是为丢失表结构的状态下,从Json还原为MDataTable时,仍可以有中央的数据结构存在。

自然首先行也大概一向便是json数据了,系统依照一些特定标识来识别第③行是架设还是多少。

 

文件数据库的增加和删除改查原理:

 

即使您对DataTable纯熟,相信也对MDataTable也如数家珍,文本数据库的增删改查,全在MDataTable里展开。

 

框架的集合:分页与Sql查询语法:

对此文本而言,存款和储蓄的结果正是json,为了多数据的合并,使的它必需具备基础的数据库应有的效益,分页与sql语句语法的查询。

为此,笔者对MDataTable进行了三个根本意义的填补,对sql语句进行剖析,然后进行列的相比,再对数据行开始展览自定义排序,从而筛选出最终结果。

为此,MDataTable事实上,就是叁个怀有分页,查询成效的精锐表类,而且能够脱离数据库,获得数码后,能够持续再拓展分页查询操作。

 

MDataTalle的别的天性:

同时,MDataTable还装有基础的批量安顿和换代成效,那些效果很要(CYQ.DBImport
多数据库数据互导功用,事实上也是用了那么些意义,从1个数据库查询出三个MDataTable,然后调用AccpertChange函数,就能够批量转移到任何数据库了,几行代码就落到实处了,相当便利)

 

总结:

着力文件数据库到那里也没啥秘密了:

1:根据实体类自动生成表结构(如若已存在表结构,自动加载)。

2:存储格式是Json,依赖JsonHelper和MDataTable举办加载和写入互动。

3:增加和删除改查,实际是凭借于MDataTable,对数据行的增加和删除改查。

4:CodeFirst情势,本质是依据MAction的落到实处。

欢迎路过的吐槽json 5。。。 

相关文章

网站地图xml地图