概述


  数据库底层的访问类库,目前支持 SqlServerOracleMySqlSQLitePostgreSqlFirebirdMariaDB 等常见数据库。


👆 主要特性

  • 实例配置:可在同一应用中提供多个实例配置,以使可以访问不同的数据库,额外提供 xmlbinary注册表 等多种配置。另外还提供集群的配置方式,可实现读写分离。
  • 适配器IProvider 用于适配不同的数据库类型,用于获取 DbProviderFactory 对象,以获得操作不同数据库的能力。该适配器通过反射的方式自动适配比较流行的驱动程序,你只需使用 nuget 引入相应的包即可,fireasy 库里本身没有做强引用。
  • 数据库操作IDatabase 提供 ADO.NET 的各种方法,如填充 DataSet、返回 Enumerable(包括T和dynamic)、返回 DataReader、Update 更新 DataTable、事务操作等方法。支持读写分离。
  • 参数化:统一使用 @ 作为前缀,编码时不需要考虑数据库的差异,它会根据数据库类型进行自动转换,同时,现在也支持 in (@array) 这种集合类型的参数值。
  • 分页参数DataPager 用于查询时指定分页的相关参数。
  • 数据库工厂:在基于实例配置的前提下,DatabaseFactory 能够返回与配置相符的 IDatabase 对象。
  • 线程间共享:在同一线程内,如果你在子方法内使用数据库工厂创建实例,皆为外层创建的同一个实例,避免了资源的重复创建。
  • 事务嵌套:如果外层已经开启事务的情况下,子方法再次开启事务将自动忽略,提交事务也只有在外层才有效,保证事务的一致笥。
  • 命令追踪:在连接字符串里配置 tracking 即可以追踪数据访问对象所执行的每一条命令,以及执行命令耗用的时间。
  • 提供者扩展:对适配器进行插件式扩展。包括:数据备份扩展、数据批量插入扩展、数据记录包装扩展、数据架构扩展、语法扩展和生成器扩展。
  • 数据备份扩展:目前只实现了 MsSql 的备份。
  • 数据批量插入扩展:实现每一种数据库类型的批量插入,该批量插入不是一般的 insert,它实现万级数据的秒插。
  • 数据记录包装扩展:针对每一种数据库类型,对 IDataReader 读取器读取各种数据数据类型进行包装,保证数据类型之间的一致性
  • 数据架构扩展:提供对元数据的查询功能,可针对不同的数据库类型,返回数据库、用户、数据表、数据字段、存储过程、外键、索引等详细信息。
  • 语法扩展:用于整合各数据库在语法上存在的差异,提供参数前缀、 逃逸符、数据类型转换、分页格式化处理、字符串连接、空判断、自编号脚本,以及各种字段串函数、日期函数、数学函数。
  • 生成器扩展:对于没有自增特性的数据库,如 oracle,可以使用序列生成主键值,另外还提供了基于公共用的方式提供序列值。
  • 富类型转换:可以将 ColorImageFontPointException 等对象放到库中,并且从库中读取。这些都是可配置的,可以自己进行扩展。
  • 分页评估:提供大数据量和小数据量场景下的分页计算方法。默认的是使用 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);
        }
    }
}