鼎鼎知识库
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. 安装
  2. ```
  3. Install-Package Maikebing.Data.Taos
  4. ```
  5. 使用
  6. ```
  7. string database = "db_" + DateTime.Now.ToString("yyyyMMddHHmmss");
  8. //配置文件
  9. var builder = new TaosConnnectionStringBuilder()
  10. {
  11. DataSource="rest/sql",
  12. DataBase = database,
  13. Username="",
  14. Password=""
  15. };
  16. //创建上下文
  17. using(var context = new TaosContext(new DbContextOptionsBuilder().UseTaos(builder.ConnectionString).Options))
  18. {
  19. context.Database.EnsureCreated();
  20. context.sensor.Add(new sensor(){ts = DateTime.Now.AddMillieseconds(i), degree=rd.NextDouble(), pm25=rd.Next(0,1000)});
  21. context.SaveChanges();
  22. }
  23. ```
  24. # 理解
  25. 把所有的配置包裹在一个类中,是常规做法,这里就是`TaosConnectionStringBuilder`,它继承了`DbConnectionStringBuilder`,而`DbConnectionStringBuilder`是`System.Data.Common`中的一员。
  26. `System.Data.Common`这个命名空间的主要负责DataSet和DataSource之间的操作,无非是读和写。TDengine的 .NET Core连接器就是利用了该命名空间的工作机制完成了数据的读写,是一种非常成熟的做法,这种成熟建立在该命名空间内在机制的成熟。
  27. `System.Data.Common`主要包含了以下几个类:
  28. - DbConnectionStringBuilder: 专门用来处理连接字符串
  29. - DbConnection:DataSet和DataSource之间的连接
  30. - DbCommand:可以理解为sql语句或者存储过程
  31. - DbParameter和DbParameterCollection:理解成DbCommand所需要的参数
  32. - DbDataReader:负责从DataSource中读取数据。
  33. - DbTransaction:可能是DbDataReader和DbCommand的封装
  34. **通过`TaosConnectionStringBuilder`传入的参数是如何被内在机制接受的呢**?
  35. 通过属性赋值进来。内部对属性如何处理呢?原来,不仅交给了基类,也交给了本类的字段。
  36. ```
  37. public class TaosConnectionStringBuilder : DbConnectionStringBuilder
  38. {
  39. //virutal意味着必须有方法体,abstract不能有方法体
  40. //virutal可以不被子类重写,但如果子类要重写必须加上override
  41. //abstract方法必须被子类重写
  42. public virutal string Username
  43. {
  44. get {return _userName;}
  45. set {
  46. base[UserNameKeyword] = _userName = value;
  47. }
  48. }
  49. }
  50. ```
  51. `TaosConnectionStringBuilder`还有一处设计很巧妙,就是通过一个静态构造函数把一个内部的枚举分别放在了只读List类型和Diction类型的集合中去了,分别是`IReadOnlyList<string>`和`IReadOnlyDictioanry<string, Keywords>`。静态构造函数什么时候会调用呢?就是类在第一次实例化或者访问类的静态成员的时候调用。
  52. ```
  53. public class TaosConnectionStringBuilder : DbConnectionStringBuilder
  54. {
  55. static TasoConnectionStringBuilder()
  56. {
  57. }
  58. //virutal意味着必须有方法体,abstract不能有方法体
  59. //virutal可以不被子类重写,但如果子类要重写必须加上override
  60. //abstract方法必须被子类重写
  61. public virutal string Username
  62. {
  63. get {return _userName;}
  64. set {
  65. base[UserNameKeyword] = _userName = value;
  66. }
  67. }
  68. }
  69. ```
  70. 这个连接器令人叹为观止的一点是还使用了`DbContext`的内在机制针对时序数据库有了上下文,这是如何做到的呢?
  71. --基本上扩展了`Entity Framework Core`的所有方面。
  72. # 扩展`IDesignTimeDbContextFactroy`
  73. 这个接口用来定义在设计时,比如生成迁移文件的时候如何设置上下文。
  74. ```
  75. public class SampleContextFactory : IDesignTimeDbContextFactory<SampleContext>
  76. {
  77. public SampleContext CreateDbContext(string[] args)
  78. {
  79. var optionsBuilder = new DbContextOptionsBuilder<SampleContext>();
  80. optionsBuilder.UseSqlServer("",opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds));
  81. return new SampleContext(optionsBuilder.Options);
  82. }
  83. }
  84. ```
  85. 上下文一定
  86. ```
  87. public SampleContext(DbContextOptions options) : base(options){}
  88. ```