本文会将前面文章介绍的tInsert、tUpdate、tDelete和tQuery接口组件进行组合,以方便在项目中扩展和应用。
首先,在应用中可以有一个数据库工厂组件,用以创建所需要的各种数据操作对象,如下面的代码(cfx/data/tDbFactory.cs)。
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数据库工厂类的实现。
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)。
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文件,修改内容如下:
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类代码如下。
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与数据库工厂的应用。
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对象的数据库类型,并不需要修改业务代码中的数据操作代码。