概述
数据库底层的访问类库,目前支持 SqlServer
、Oracle
、MySql
、SQLite
、PostgreSql
、Firebird
、MariaDB
等常见数据库。
👆 主要特性
- 实例配置:可在同一应用中提供多个实例配置,以使可以访问不同的数据库,额外提供
xml
、binary
、注册表
等多种配置。另外还提供集群的配置方式,可实现读写分离。 - 适配器:
IProvider
用于适配不同的数据库类型,用于获取DbProviderFactory
对象,以获得操作不同数据库的能力。该适配器通过反射的方式自动适配比较流行的驱动程序,你只需使用 nuget 引入相应的包即可,fireasy 库里本身没有做强引用。 - 数据库操作:
IDatabase
提供 ADO.NET 的各种方法,如填充DataSet
、返回Enumerable
(包括T和dynamic)、返回DataReader
、Update 更新DataTable
、事务操作等方法。支持读写分离。 - 参数化:统一使用 @ 作为前缀,编码时不需要考虑数据库的差异,它会根据数据库类型进行自动转换,同时,现在也支持 in (@array) 这种集合类型的参数值。
- 分页参数:
DataPager
用于查询时指定分页的相关参数。 - 数据库工厂:在基于实例配置的前提下,
DatabaseFactory
能够返回与配置相符的IDatabase
对象。 - 线程间共享:在同一线程内,如果你在子方法内使用数据库工厂创建实例,皆为外层创建的同一个实例,避免了资源的重复创建。
- 事务嵌套:如果外层已经开启事务的情况下,子方法再次开启事务将自动忽略,提交事务也只有在外层才有效,保证事务的一致笥。
- 命令追踪:在连接字符串里配置 tracking 即可以追踪数据访问对象所执行的每一条命令,以及执行命令耗用的时间。
- 提供者扩展:对适配器进行插件式扩展。包括:数据备份扩展、数据批量插入扩展、数据记录包装扩展、数据架构扩展、语法扩展和生成器扩展。
- 数据备份扩展:目前只实现了
MsSql
的备份。 - 数据批量插入扩展:实现每一种数据库类型的批量插入,该批量插入不是一般的 insert,它实现万级数据的秒插。
- 数据记录包装扩展:针对每一种数据库类型,对
IDataReader
读取器读取各种数据数据类型进行包装,保证数据类型之间的一致性 - 数据架构扩展:提供对元数据的查询功能,可针对不同的数据库类型,返回数据库、用户、数据表、数据字段、存储过程、外键、索引等详细信息。
- 语法扩展:用于整合各数据库在语法上存在的差异,提供参数前缀、 逃逸符、数据类型转换、分页格式化处理、字符串连接、空判断、自编号脚本,以及各种字段串函数、日期函数、数学函数。
- 生成器扩展:对于没有自增特性的数据库,如
oracle
,可以使用序列生成主键值,另外还提供了基于公共用的方式提供序列值。 - 富类型转换:可以将
Color
、Image
、Font
、Point
、Exception
等对象放到库中,并且从库中读取。这些都是可配置的,可以自己进行扩展。 - 分页评估:提供大数据量和小数据量场景下的分页计算方法。默认的是使用 TotalRecordEvaluato 方式,如果数据量比较大,可以使用 TryNextEvaluator 方式。
- 排序转换器:排序时,用于将前端的字段与数据库字段进行转换对应。
👆 结构图
下面是本章中比较重要的几个接口和类的结构图:
👆 示例代码
public void Sample()
{
using (var db = DatabaseFactory.CreateDatabase())
{
//查询返回
var customers = db.ExecuteEnumerable<Customer>((SqlCommand)"select * from customers");
//分页,参数化
var ds = new DataSet();
var paper = new DataPager(5, 0);
var parameters = new ParameterCollection();
parameters.Add("city", "London");
db.FillDataSet(ds, (SqlCommand)"select city from customers where city <> @city", segment: paper, parameters: parameters);
//批量插入
var list = new List<BatcherData>();
for (var i = 0; i < 100000; i++)
{
list.Add(new BatcherData { ID = i, NAME = new Size(12, 20), BIRTHDAY = DateTime.Now });
}
var provider = db.Provider.GetService<IBatcherProvider>();
provider.Insert(db, list, "BATCHERS");
//获取所有表定义
var schema = db.Provider.GetService<ISchemaProvider>();
var parameter = db.Provider.GetConnectionParameter(db.ConnectionString);
foreach (var table in schema.GetSchemas<Table>(db, s => s.Schema == parameter.Schema))
{
Console.WriteLine(table.Name + "," + table.Description);
}
}
}