C#组合数据操作组件

本文会将前面文章介绍的tInsert、tUpdate、tDelete和tQuery接口组件进行组合,以方便在项目中扩展和应用。

数据库工厂组件

首先,在应用中可以有一个数据库工厂组件,用以创建所需要的各种数据操作对象,如下面的代码(cfx/data/tDbFactory.cs)。

C#
namespace cfx.data
{
    public interface tDbFactory
    {
        string CnnStr { get; }
        tInsert GetInsert(string table);
        tUpdate GetUpdate(string table);
        tDelete GetDelete(string table);
        tQuery GetQuery(string source);
    }
    //
    public abstract class tDbFactoryBase : tDbFactory
    {
        protected string myCnnStr;
        public tDbFactoryBase(string cnnstr)
        {
            myCnnStr = cnnstr;
        }
        //
        public string CnnStr { get { return myCnnStr; } }
        //
        public abstract tInsert GetInsert(string table);
        public abstract tUpdate GetUpdate(string table);
        public abstract tDelete GetDelete(string table);
        public abstract tQuery GetQuery(string source);
    }
}

代码很简单,首先是tDbFactory接口,其中除了CnnStr只读属性用于返回数据库连接字符串,其它四个方法分别返回实现了tInsert、tUpdate、tDelete、tQuery接口的对象,参数是操作的表(或查询数据源)。

接下来的tDbFactoryBase类,是实现tDbFactory接口组件的基类,其中实现了构造函数和CnnStr只读属性,其中,构造函数的参数需要指定数据库连接字符串,并保存到myCnnStr字段。

下面的代码(cfx/data/mysql/tMySqlFactory.cs)是MySQL数据库工厂类的实现。

C#
namespace cfx.data.mysql
{
    public class tMySqlFactory : tDbFactoryBase
    {
        public tMySqlFactory(string cnnstr) : base(cnnstr) { }
        //
        public static tMySqlFactory Create(string cnnstr)
        {
            return new tMySqlFactory(cnnstr);
        }
        //
        public override tInsert GetInsert(string table)
        {
            return tMySqlInsert.Create(myCnnStr, table);
        }
        //
        public override tUpdate GetUpdate(string table)
        {
            return tMySqlUpdate.Create(myCnnStr, table);
        }
        //
        public override tDelete GetDelete(string table)
        {
            return tMySqlDelete.Create(myCnnStr, table);
        }
        //
        public override tQuery GetQuery(string source)
        {
            return tMySqlQuery.Create(myCnnStr, source);
        }
        //
    }
}

代码中实现了tMySqlFactory类,其中,构造函数和Create()静态方法用于创建类的实例;接下来实现了GetInsert()、GetUpdate()、GetDelete()、GetQuery()方法,分别返回对应的tMySqlInsert、tMySqlUpdate、tMySqlDelete、tMySqlQuery对象。

SQL Server数据库工厂类也使用类似的代码实现,如下面的代码(cfx/data/sql/tSqlFactory.cs)。

C#
namespace cfx.data.sql
{
    public class tSqlFactory : tDbFactoryBase
    {
        public tSqlFactory(string cnnstr) : base(cnnstr) { }
        //
        public static tSqlFactory Create(string cnnstr)
        {
            return new tSqlFactory(cnnstr);
        }
        //
        public override tInsert GetInsert(string table)
        {
            return tSqlInsert.Create(myCnnStr, table);
        }
        //
        public override tUpdate GetUpdate(string table)
        {
            return tSqlUpdate.Create(myCnnStr, table);
        }
        //
        public override tDelete GetDelete(string table)
        {
            return tSqlDelete.Create(myCnnStr, table);
        }
        //
        public override tQuery GetQuery(string source)
        {
            return tSqlQuery.Create(myCnnStr, source);
        }
        //
    }
}

应用配置类

接下来,在项目主目录下创建appcur目录,并在其中创建tApp.cs文件,修改内容如下:

C#
using cfx;
using cfx.data;
using cfx.data.mysql;

public static class tApp
{
    // 数据库连接字符串
    private static string cnnstr1 =
        tMySqlHelper.GetCnnStr("127.0.0.1", "cdb_cs1", "root", "DEV_Test123456", 3306);
    // 数据库工厂
    public static tDbFactory dbFact1 = tMySqlFactory.Create(cnnstr1);
    //
}

代码中定义了tApp类,只有一个公共成员,即dbFact1字段,定义为tMySqlFactory对象,使用了cnnstr1字段定义的数据库连接字符串。一般来讲,在实际工作中会直接使用数据库连接字符串,可以使用tMySqlHelper.GetCnnStr()方法生成后复制到cnnstr1字段中,修改后的tApp类代码如下。

C#
using cfx;
using cfx.data;
using cfx.data.mysql;

public static class tApp
{
    // 数据库连接字符串
    private static string cnnstr1 =
        @"server=127.0.0.1;database=cdb_cs1;
user id=root;password=DEV_Test123456;port=3306;
pooling=True;connectiontimeout=30;defaultcommandtimeout=30";
    // 数据库工厂
    public static tDbFactory dbFact1 = tMySqlFactory.Create(cnnstr1);
    //
}

请注意,cnnstr1字段中的数据库连接字符串使用了逐字字符串定义。此外,如果一个项目中使用了多个数据库,可以定义多个工厂对象进行操作。

需要注意,tApp类没有定义命名空间,它会存在于项目所在的命名空间中,在项目中可以全局使用。在tApp类中,除定义数据工厂对象,还可以定义应用的初始化等操作。

下面的代码,在Program.cs中测试tApp与数据库工厂的应用。

C#
using System;
using cfx.data;
namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            tPair result = tApp.dbFact1.GetQuery("t1")
                .SetField("f1").SetCond(tCond.Equal("f1", "user01"))
                .GetValue();
            Console.WriteLine(result.Value);
        }
    }
}

如果还保留了前面文章中的测试数据,执行代码会显示user01,如果数据库连接错误或没有f1字段为user01的记录,则会显示空行。可以看到,对一系列的数据操作组件封装和组织以后,在代码中操作数据库大为简化。

关于数据组件

首先来看截止目前创建的数据组件结构,如下图所示。

数据组件结构

图中包含了主要的数据操作组件,tCond作为条件类,tPair和tPairList类作为数据传递容器,是数据应用的重要工具。从tDbFactroy接口组件出发,垂直方向包含了四个基本的数据库操作组件,分别是添加(tInsert)、修改(tUpdate)、删除(tDelete)和查询(tQuery),实际应用中可以根据需要添加更多的功能组件。从水平方向来看,每个组件又实现了MySQL和SQL Server数据库的支持,实际工作中可以实现对更多数据库的支持。这里,我们的数据操作组件就是一个可以灵活扩展的工具集合。

使用数据组件集还可以将数据库操作高度抽象化,如前面的示例中,在tApp类中配置数据库工厂对象以后,在Program.cs操作时没有体现操作的是哪个数据库。也就是说,如果更改了tApp.dbFact1对象的数据库类型,并不需要修改业务代码中的数据操作代码。