.NET连接 TDengine ,.NET 操作 TDengine

1、功能描述

SqlSugar 是 .net中最早支持TDengine最成熟的的ORM框架,大量用户投入生产

1.支持使用原生(非HTTP连接)连高性能

2.并且支持微秒和纳秒

3.支持根据Tag自动创建子表

4.支持的类型齐全

2、版本和升级

SqlSugar.TDengineCore 4.18.6+

SqlSugarCore  5.1.4.187+

不需要加 typeof(CommonPropertyConvert) 

3、创建对象

 //程序启动时加入(这个只要执行一次)
InstanceFactory.CustomAssemblies =
    new System.Reflection.Assembly[] { typeof(TDengineProvider).Assembly };
    
//创建 db对象    
var db = new SqlSugarClient(new ConnectionConfig()
  {
      DbType = SqlSugar.DbType.TDengine,
      ConnectionString = Config.ConnectionString,
      IsAutoCloseConnection = true,
      ConfigureExternalServices = new ConfigureExternalServices()
      {
           //最新版本不需 typeof(CommonPropertyConvert) 
           //升级到:SqlSugar.TDengineCore 4.18.6+ SqlSugarCore  5.1.4.187+
      }
  });

变更说明:给所有列加上通用转换,在EntityService中加

4、TDengine 连接字符串

Host=localhost;Port=6030;Username=root;Password=taosdata;Database=power
//默认是毫秒,要微秒等看下面有介绍

5、重要:表模式

小写表 (默认)

 //程序启动时加入
InstanceFactory.CustomAssemblies =
    new System.Reflection.Assembly[] { typeof(TDengineProvider).Assembly };
    
 var db = new SqlSugarClient(new ConnectionConfig()
  {
      DbType = SqlSugar.DbType.TDengine,
      ConnectionString = Config.ConnectionString,
      IsAutoCloseConnection = true,  //2个DLL升级到最新老版本需要加
  });

驼峰表

//程序启动时加入
InstanceFactory.CustomAssemblies =
    new System.Reflection.Assembly[] { typeof(TDengineProvider).Assembly };
    
var db= new SqlSugarClient(new ConnectionConfig(){
           DbType = SqlSugar.DbType.PostgreSQL,
           ConnectionString = Config.ConnectionString,
           IsAutoCloseConnection = true,
           MoreSettings= new ConnMoreSettings()
           {
             PgSqlIsAutoToLower = false,//增删查改支持驼峰表
             PgSqlIsAutoToLowerCodeFirst = false, // 建表建驼峰表。5.1.3.30 
           }} 
           )

6、TDengine 客户端SDK安装

当前程序需要安装Sdk才能连接数据库

https://docs.taosdata.com/connector

7、TDengine Nuegt安装

下面是NUGET安装

SqlSugar.TDengineCore
SqlSugarCore

8、声名对象

 
 //程序启动时加入
InstanceFactory.CustomAssemblies =
    new System.Reflection.Assembly[] { typeof(TDengineProvider).Assembly };
    
//db对象    
SqlSugarClient Db= new SqlSugarClient(new ConnectionConfig(){
           ConnectionString = "连接符字串", 
           DbType = DbType.TDengine,
           IsAutoCloseConnection = true});

9、时间精度+建库

新支持请升级:SqlSugar.TDengineCore 2.1+

毫秒

 //手动赋值
 [SugarColumn(IsPrimaryKey = true)]
 public DateTime ts { get; set; }
 
 //数据库默认值(推荐)
 [SugarColumn(IsPrimaryKey =true,InsertServerTime =true)]
 
 //ORM 默认字符串建毫秒库
 db.DbMaintenance.CreateDatabase();

微秒 (多个库要一致)

注意:连接字符串加上 TsType=config_us 不然条件过滤不了

 //连接字符串加上 TsType=config_us 
 
 [SugarColumn(IsPrimaryKey = true,SqlParameterDbType =typeof(DateTime16))]
 public DateTime ts { get; set; }
 
 
 
 
 //ORM 建库方法创建库 字符串加上 TsType=config_us 可以创建微秒库
 db.DbMaintenance.CreateDatabase();

纳秒 (多个库要一致)

注意:连接字符串加上 TsType=config_ns 不然条件过滤不了

 //TsType=config_ns
 
 [SugarColumn(IsPrimaryKey = true,SqlParameterDbType =typeof(DateTime19))]
 public DateTime ts { get; set; }
 
  
 
  //ORM 建库方法创建库 字符串加上 TsType=config_ns 可以创建纳秒库
  db.DbMaintenance.CreateDatabase();

11、执行SQL

    //建库
    db.Ado.ExecuteCommand("CREATE DATABASE IF NOT EXISTS power WAL_RETENTION_PERIOD 3600");
 
    //建超级表
    db.Ado.ExecuteCommand("CREATE STABLE IF NOT EXISTS  MyTable (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (location BINARY(64), groupId INT)");
 
    //创建子表
    db.Ado.ExecuteCommand(@"create table IF NOT EXISTS  MyTable01 using MyTable tags('California.SanFrancisco',1)");
 
         
    //insert sql
    //db.Ado.ExecuteCommand(insrtSql);
 
    //查询子表
    var dt = db.Ado.GetDataTable("select * from MyTable01");
 
    //查询超级表
    var dt2 = db.Ado.GetDataTable("select * from MyTable");

单表查询

 var list2 = db.Queryable<MyTable02>().Where(it => it.name == "测试2").ToList();
 var list22 = db.Queryable<MyTable02>().Where(it => it.voltage == 222).ToList();
 var list222 = db.Queryable<MyTable02>().Where(it => it.phase == 1.2).ToList();
 var list2222 = db.Queryable<MyTable02>().Where(it => it.isdelete == true).ToList();

12、联表查询

  //联表查询:不支持left join只能这样
   var list101= db.Queryable<MyTable02, MyTable02>((x, y) => x.ts == y.ts)
                .Select((x,y) => new
                {
                    xts=x.ts,
                    yts=y.ts
                }).ToList();

13、函数用法

  //模糊查询
  var list3 = db.Queryable<MyTable02>().Where(it => it.name.Contains("a")).ToList();

 //时间差函数 
 var list31 = db.Queryable<MyTable02>().Select(it =>
            new
            {
                diff = SqlFunc.DateDiff(DateType.Day, it.ts, DateTime.Now),
                time=it.ts
            }).ToList();

  //时间加1天
  var list32 = db.Queryable<MyTable02>().Select(it =>
              new
              {
                  addTime = SqlFunc.DateAdd(it.ts,1, DateType.Day),
                  oldime = it.ts
              }).ToList();
              
  //自定义函数:实现时间加1天
    var list33 = db.Queryable<MyTable02>().Select(it =>
              new
              {
                  addTime =SqlFunc.MappingColumn<DateTime>(" `ts`+1d "),
                  oldime = it.ts
              }).ToList();

14、插入

14.1 固定子表写入

  //小数据批量插入子表
  db.Insertable(list).ExecuteCommand();
  db.Insertable(list).AS(表名).ExecuteCommand();
    
  //大数据批量插入子表(最新版本支持)
  db.Fastest<MyTable02>().BulkCopy(list);
  db.Fastest<MyTable02>().AS(表名).BulkCopy(list);

  //子表实体
  public class MyTable02
  {
         [SugarColumn(IsPrimaryKey =true)]
         public DateTime ts { get; set; }
         
         public string name { get; set; }
         
         public float phase { get; set; }
            
         [SugarColumn(IsOnlyIgnoreInsert =true,IsOnlyIgnoreUpdate =true)]//Tags字段禁止插入
         public string location { get; set; }
         
         [SugarColumn(IsOnlyIgnoreInsert = true, IsOnlyIgnoreUpdate = true)]//Tags字段禁止插入
         public int groupId { get; set; }
   }

14.2 动态子表写入据据Tag

Insertable 看标题16.2 ( 适合少量子表和数据 )

BulkCopy 看标题16.3  (适合一次建很多子表,一次插入很多数据 )

16、建表 

 16.1 固定创建一个表

创建表以子表为准(超级表名字是固定的前缀+表名) CRUD也是子表为准

  db.CodeFirst.InitTables<CodeFirst03>();//建表
  
  db.Insertable(new CodeFirst03()
    {
    Ts = DateTime.Now,
    Boolean = true,
    Char = 'a'
    }).ExecuteCommand(); 
    
   var list3 = db.Queryable<CodeFirst03>().ToList();
  
  
  public class CodeFirst03 : STable //需要继承 STable
  {
      [SqlSugar.SugarColumn(IsPrimaryKey = true)]
      public DateTime Ts { get; set; }
      public bool Boolean { get; set; }
      public byte Byte { get; set; }
      public sbyte SByte { get; set; }
      public char Char { get; set; }
  }

注意需要继承:STable

 16.2 根据Tag建表

 SqlSugar.TDengineCore  4.18.3+

 SqlSugraCore 5.1.4.179

 
//创建超级表扔在程序初始话的地方
db.CodeFirst.InitTables<SUsingTagModel>();

//查询所有 
var list1 = db.Queryable<SUsingTagModel>().AsTDengineSTable().ToList();

//查询子表A
var tagA = db.Queryable<SUsingTagModel>().AsTDengineSTable().Where(it => it.Tag1 == "a").ToList();

//查询子表B
var tagB = db.Queryable<SUsingTagModel>().AsTDengineSTable().Where(it => it.Tag1 == "b").ToList(); 

//插入并根据Tag的值创建子表
db.Insertable(new List<SUsingTagModel>(){
                new SUsingTagModel()
                {
                  Boolean = true,
                  Tag1 = "a",
                  //没启用微秒纳秒时间不能一样
                  Ts = DateTime.Now.AddMilliseconds(1)
                 },
                 new SUsingTagModel()
                 {
                   Boolean = true,
                   Tag1 = "b",
                   //没启用微秒纳秒时间不能一样
                 Ts = DateTime.Now.AddMilliseconds(3)}}
  )
.SetTDengineChildTableName((stableName, it) => $"{stableName}_{it.Tag1}"/*设置子表名字*/)
.ExecuteCommand(); //内部有分页对性能优化过了

[STableAttribute(STableName = "SUsingTagModel", Tag1 = nameof(Tag1))]
public class SUsingTagModel
{
    [SqlSugar.SugarColumn(IsPrimaryKey = true)]
    public DateTime Ts { get; set; }
    public bool Boolean { get; set; }
    public string Tag1 { get; set; }
}



 //用动态超级表可以将表名也动态
 db.MappingSTableName<SUsingTagModel>("newSName001");
 //db.MappingSTableName写在前面才会生效
 //替换特性中的 STableName = "SUsingTagModel"
 //特性中STableNameb也需要一个唯一的默认值

16.3 BulkCopy根据Tag建表

      public static void BulkCopy(ISqlSugarClient db) 
      {
          //建表超级表(扔在程序启动时)
          db.CodeFirst.InitTables<BulkDemo2>();

          //设置子表格式和Tag字段
          TDengineFastBuilder.SetTags(db, (tag,stable) => $"{stable}_{tag}", "Tag1"); 
          //根据设置的Tag写入数据库
          db.Fastest<BulkDemo2>().BulkCopy(new List<BulkDemo2>(){
              new BulkDemo2()
              {
                      Boolean = true,
                      Tag1 = "a",
                      //没启用微秒纳秒时间不能一样
                      Ts = DateTime.Now.AddMilliseconds(1)

               }
             });
          //查询
          var list= db.Queryable<BulkDemo2>().ToList();
      }

      [STableAttribute(STableName = "BulkDemo2", Tag1 = nameof(Tag1))]
      public class BulkDemo2
      {
          [SqlSugar.SugarColumn(IsPrimaryKey = true)]
          public DateTime Ts { get; set; }
          public bool Boolean { get; set; }
          public string Tag1 { get; set; }
      }

源码和DEMO

找到TDengineTests文件夹

https://github.com/DotNetNext/SqlSugar


image.png

发布缺少Dll(单文件或者裁剪)

升级:5.1.4.114-preview+  

//程序启动时加入
InstanceFactory.CustomAssemblies =
    new System.Reflection.Assembly[] { typeof(TDengineProvider).Assembly };


关闭
果糖网