鼎鼎知识库
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

TDengine连接器Maikebing.Data.Taos.md 3.9KB

安装

Install-Package Maikebing.Data.Taos

使用

string database = "db_" + DateTime.Now.ToString("yyyyMMddHHmmss");

//配置文件
var builder = new TaosConnnectionStringBuilder()
{
    DataSource="rest/sql",
    DataBase = database,
    Username="",
    Password=""
};

//创建上下文
using(var context = new TaosContext(new DbContextOptionsBuilder().UseTaos(builder.ConnectionString).Options))
{
    context.Database.EnsureCreated();
    context.sensor.Add(new sensor(){ts = DateTime.Now.AddMillieseconds(i), degree=rd.NextDouble(), pm25=rd.Next(0,1000)});
    context.SaveChanges();
}

理解

把所有的配置包裹在一个类中,是常规做法,这里就是TaosConnectionStringBuilder,它继承了DbConnectionStringBuilder,而DbConnectionStringBuilderSystem.Data.Common中的一员。

System.Data.Common这个命名空间的主要负责DataSet和DataSource之间的操作,无非是读和写。TDengine的 .NET Core连接器就是利用了该命名空间的工作机制完成了数据的读写,是一种非常成熟的做法,这种成熟建立在该命名空间内在机制的成熟。

System.Data.Common主要包含了以下几个类:

  • DbConnectionStringBuilder: 专门用来处理连接字符串
  • DbConnection:DataSet和DataSource之间的连接
  • DbCommand:可以理解为sql语句或者存储过程
  • DbParameter和DbParameterCollection:理解成DbCommand所需要的参数
  • DbDataReader:负责从DataSource中读取数据。
  • DbTransaction:可能是DbDataReader和DbCommand的封装

通过TaosConnectionStringBuilder传入的参数是如何被内在机制接受的呢

通过属性赋值进来。内部对属性如何处理呢?原来,不仅交给了基类,也交给了本类的字段。

public class TaosConnectionStringBuilder : DbConnectionStringBuilder
{
    //virutal意味着必须有方法体,abstract不能有方法体
    //virutal可以不被子类重写,但如果子类要重写必须加上override
    //abstract方法必须被子类重写
    public virutal string Username
    {
        get {return _userName;}
        set {
            base[UserNameKeyword] = _userName = value;
        }
    }
}

TaosConnectionStringBuilder还有一处设计很巧妙,就是通过一个静态构造函数把一个内部的枚举分别放在了只读List类型和Diction类型的集合中去了,分别是IReadOnlyList<string>IReadOnlyDictioanry<string, Keywords>。静态构造函数什么时候会调用呢?就是类在第一次实例化或者访问类的静态成员的时候调用。

public class TaosConnectionStringBuilder : DbConnectionStringBuilder
{
    static TasoConnectionStringBuilder()
    {

    }

    //virutal意味着必须有方法体,abstract不能有方法体
    //virutal可以不被子类重写,但如果子类要重写必须加上override
    //abstract方法必须被子类重写
    public virutal string Username
    {
        get {return _userName;}
        set {
            base[UserNameKeyword] = _userName = value;
        }
    }
}

这个连接器令人叹为观止的一点是还使用了DbContext的内在机制针对时序数据库有了上下文,这是如何做到的呢?

--基本上扩展了Entity Framework Core的所有方面。

扩展IDesignTimeDbContextFactroy

这个接口用来定义在设计时,比如生成迁移文件的时候如何设置上下文。

public class SampleContextFactory : IDesignTimeDbContextFactory<SampleContext>
{
    public SampleContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<SampleContext>();
    optionsBuilder.UseSqlServer("",opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds));
    
        return new SampleContext(optionsBuilder.Options);
    }
    
}

上下文一定

public SampleContext(DbContextOptions options) : base(options){}