using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using InfluxData.Net.Common; using InfluxData.Net.InfluxDb; namespace Mesnac.Basic { /// <summary> /// 时序数据库InfluxDb辅助类 /// </summary> public class InfluxDbHelper { #region 字段定义 private int _errCount = 0; //失败异常的次数 private string influxDbPath = @"D:\influxdb-1.4.3-1"; //时序数据库InfluxDb的根目录 private string endpointUri = "http://localhost:8086"; //时序数据库服务器的访问Uri private string username = "root"; //时序数据库服务器用户名 private string password = "root"; //时序数据服务器密码 private bool _isStart = false; //时序数据库服务器是否启动 private InfluxDbClient _client = null; //时序数据库客户端对象 private readonly string backViewDbName = "MesnacBackView"; //回放数据库的名称 private readonly string backViewTableName = "Monitor"; //回放数据表名称 private readonly string curveDbName = "MesnacCurve"; //曲线数据库的名称 private readonly string mixCurveTableName = "MixCurveData"; //密炼曲线数据表名称 private readonly string millCurveTableName = "MillCurveData"; //开炼曲线数据表名称 private readonly string backViewRetentionPolicyName = "BackViewDataSaveDays"; //回放数据库保留策略名称 private int backViewDataSaveDays = 30; //回放数据保留的天数 #endregion #region 单例实现 private static InfluxDbHelper _instance = null; private InfluxDbHelper() { this.influxDbPath = AppConfigHelper.GetAppSettingValue("InfluxDb_Path", @"D:\influxdb-1.4.3-1"); this.endpointUri = AppConfigHelper.GetAppSettingValue("InfluxDb_EndPointUri", "http://localhost:8086"); this.username = AppConfigHelper.GetAppSettingValue("InfluxDb_UserName", "root"); this.password = AppConfigHelper.GetAppSettingValue("InfluxDb_Password", "root"); this.backViewDataSaveDays = AppConfigHelper.GetAppSettingValue("BackViewDataSaveDays", 30); //this.StopDbServer(); //System.Threading.Thread.Sleep(10); //this.StartDbServer(); //System.Threading.Thread.Sleep(50); if (!this.IsStartDbServer) { this.StartDbServer(); } } public static InfluxDbHelper Instance { get { lock (String.Empty) { if (_instance == null) { _instance = new InfluxDbHelper(); } return _instance; } } } #endregion #region 属性定义 /// <summary> /// 回放数据库名称 /// </summary> public string BackViewDbName { get { return this.backViewDbName; } } /// <summary> /// 返回数据保存策略名称 /// </summary> public string BackViewRetentionPolicyName { get { return this.backViewRetentionPolicyName; } } /// <summary> /// 回放数据表名称 /// </summary> public string BackViewTableName { get { return this.backViewTableName; } } /// <summary> /// 密炼曲线数据表名称 /// </summary> public string MixCurveTableName { get { return this.mixCurveTableName; } } /// <summary> /// 开炼曲线数据表名称 /// </summary> public string MillCurveTableName { get { return this.millCurveTableName; } } /// <summary> /// 服务是否启动 /// </summary> public bool StartState { get { return this._isStart; } } /// <summary> /// InfluxDb客户端对象,用于执行查询 /// </summary> public InfluxDbClient Client { get { if (_client == null) { if (!this.StartState) { this.StartDbServer(); } if (this.StartState) { _client = new InfluxDbClient(this.endpointUri, this.username, this.password, InfluxData.Net.Common.Enums.InfluxDbVersion.Latest); } } return _client; } } #endregion #region 方法定义 #region 判断InfluxDbServer是否已启动 /// <summary> /// 判断InfluxDbServer是否已启动 /// </summary> public bool IsStartDbServer { get { this._isStart = WinCmdHelper.CheckProcessExists("influxd", String.Empty); if (this._isStart) { this.CreateBackViewDb(); //创建回放数据库 this.CreateBackViewRetentionPolicy(); //创建回放数据保留策略 this.CreateCurveDb(); } return this._isStart; } } #endregion #region 启动InfluxDbServer /// <summary> /// 启动InfluxDbServer /// </summary> public void StartDbServer() { System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(this.DoStartDbServerTask)); t.Start(); this._isStart = true; this.CreateBackViewDb(); //创建回放数据库 this.CreateBackViewRetentionPolicy(); //创建回放数据保留策略 this.CreateCurveDb(); //创建曲线数据库 } private void DoStartDbServerTask() { string cmd = String.Format("{0} -config {1}", System.IO.Path.Combine(this.influxDbPath, "influxd.exe"), System.IO.Path.Combine(this.influxDbPath, "influxdb.conf")); bool result = Mesnac.Basic.WinCmdHelper.ExcuteDosCommand(cmd, false, false); if (result) { this._isStart = true; ICSharpCode.Core.LoggingService<InfluxDbHelper>.Info("The InfluxDb Server start success!"); } else { this._isStart = false; ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("The InfluxDb Server Start failure!"); } } #endregion #region 停止InfluxDbServer /// <summary> /// 停止InfluxDbServer /// </summary> public void StopDbServer() { bool result = WinCmdHelper.KillProcessExists("influxd", String.Empty); if (result) { this._isStart = false; ICSharpCode.Core.LoggingService<InfluxDbHelper>.Info("The InfluxDb Server Stop success!"); } else { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("The InfluxDb Server Stop failure!"); } } #endregion #region 创建回放数据库 /// <summary> /// 创建回放数据库 /// </summary> public void CreateBackViewDb() { try { if (!this.StartState) { return; } Task<InfluxData.Net.Common.Infrastructure.IInfluxDataApiResponse> task = this.Client.Database.CreateDatabaseAsync(this.backViewDbName); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Info("Create BackView Db Result success = " + task.Result.Success); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Info("Create BackView Db Result Body = " + task.Result.Body); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Info("Create BackView Db Result StatusCode =" + task.Result.StatusCode); } catch (Exception ex) { this._errCount++; ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("创建回放数据库异常:" + ex.Message, ex); } } #endregion #region 创建曲线数据库 /// <summary> /// 创建曲线数据库 /// </summary> public void CreateCurveDb() { try { if (!this.StartState) { return; } Task<InfluxData.Net.Common.Infrastructure.IInfluxDataApiResponse> task = this.Client.Database.CreateDatabaseAsync(this.curveDbName); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Info("Create Curve Db Result success = " + task.Result.Success); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Info("Create Curve Db Result Body = " + task.Result.Body); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Info("Create Curve Db Result StatusCode =" + task.Result.StatusCode); } catch (Exception ex) { this._errCount++; ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("创建曲线数据库异常:" + ex.Message, ex); } } #endregion #region 创建回放数据库的保留策略 /// <summary> /// 创建回放数据库的保留策略 /// </summary> public void CreateBackViewRetentionPolicy() { try { if (!this.StartState) { return; } string duration = String.Format("{0}d", this.backViewDataSaveDays); Task<InfluxData.Net.Common.Infrastructure.IInfluxDataApiResponse> task = this.Client.Retention.CreateRetentionPolicyAsync(this.backViewDbName, this.backViewRetentionPolicyName, duration, 1); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Info("Create BackView Retention Policy Result success = " + task.Result.Success); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Info("Create BackView Retention Policy Result Body = " + task.Result.Body); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Info("Create BackView Retention Policy Result StatusCode =" + task.Result.StatusCode); } catch (Exception ex) { this._errCount++; ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("创建回放数据库的保留策略异常:" + ex.Message, ex); } } #endregion #region 写数据至回放数据库 /// <summary> /// 写数据至回放数据库 /// </summary> /// <param name="data">要写入的数据</param> public void WriteDataToBackViewDb(Dictionary<string, object> data) { try { if (!this.StartState) { return; } //ICSharpCode.Core.LoggingService<InfluxDbHelper>.Info("field count = " + data.Count); InfluxData.Net.InfluxDb.Models.Point point = new InfluxData.Net.InfluxDb.Models.Point(); point.Name = this.backViewTableName; //表名 //point.Tags = new Dictionary<string, object>() { { "EquipCode", "01001" } }; point.Fields = data; point.Timestamp = DateTime.Now; Task<InfluxData.Net.Common.Infrastructure.IInfluxDataApiResponse> task = this.Client.Client.WriteAsync(point, this.backViewDbName, this.backViewRetentionPolicyName, InfluxData.Net.Common.Constants.TimeUnit.Seconds); if (task != null && task.Result != null && !task.Result.Success) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Warn("Write Data to backView db result success =" + task.Result.Success); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Warn("Write Data to backView db result Body =" + task.Result.Body); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Warn("Write Data to backView db result StatusCode =" + task.Result.StatusCode); } } catch (Exception ex) { this._errCount++; ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("保存回放数据异常:" + ex.Message, ex); } } #endregion #region 写数据至曲线数据库 /// <summary> /// 写数据至曲线数据库 /// </summary> /// <param name="equipCode">机台编号</param> /// <param name="data">曲线数据</param> public void WriteDataToCurveDb(string equipCode, Dictionary<string, object> data) { try { if (!this.StartState) { return; } InfluxData.Net.InfluxDb.Models.Point point = new InfluxData.Net.InfluxDb.Models.Point(); point.Name = this.mixCurveTableName; //表名 point.Tags = new Dictionary<string, object>() { { "EquipCode", equipCode } }; point.Fields = data; point.Timestamp = DateTime.Now; Task<InfluxData.Net.Common.Infrastructure.IInfluxDataApiResponse> task = this.Client.Client.WriteAsync(point, this.curveDbName, null, InfluxData.Net.Common.Constants.TimeUnit.Seconds); if (task != null && task.Result != null && !task.Result.Success) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Warn("Write Data to curve db result success =" + task.Result.Success); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Warn("Write Data to curve db result Body =" + task.Result.Body); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Warn("Write Data to curve db result StatusCode =" + task.Result.StatusCode); } } catch (Exception ex) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("保存曲线数据异常:" + ex.Message, ex); } } /// <summary> /// 写曲线数据至曲线数据库表 /// </summary> /// <param name="tableName">要写入的表名</param> /// <param name="equipCode">机台编号</param> /// <param name="unitNum">设备编号</param> /// <param name="data">曲线数据</param> public void WriteDataToCurveDb(string tableName, string equipCode, string unitNum, Dictionary<string, object> data, DateTime? time) { try { if (!this.StartState) { return; } InfluxData.Net.InfluxDb.Models.Point point = new InfluxData.Net.InfluxDb.Models.Point(); point.Name = tableName; //表名 point.Tags = new Dictionary<string, object>() { { "EquipCode", equipCode }, { "UnitNum", unitNum } }; point.Fields = data; if (time == null) { point.Timestamp = DateTime.Now; } else { point.Timestamp = time; } Task<InfluxData.Net.Common.Infrastructure.IInfluxDataApiResponse> task = this.Client.Client.WriteAsync(point, this.curveDbName, null, InfluxData.Net.Common.Constants.TimeUnit.Seconds); if (task != null && task.Result != null && !task.Result.Success) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Warn("Write Data to curve db result success =" + task.Result.Success); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Warn("Write Data to curve db result Body =" + task.Result.Body); ICSharpCode.Core.LoggingService<InfluxDbHelper>.Warn("Write Data to curve db result StatusCode =" + task.Result.StatusCode); } } catch (Exception ex) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("保存曲线数据异常:" + ex.Message, ex); } } #endregion #region 从曲线数据库获取数据 /// <summary> /// 从曲线数据库获取数据 /// </summary> /// <param name="equipCode">机台号</param> /// <param name="columnList">字段列表</param> /// <param name="begin">开始时间</param> /// <param name="end">结束时间</param> /// <returns>返回对应的曲线数据</returns> public Dictionary<string, IList<object>> GetDataFromCurveDb(string equipCode, List<string> columnList, DateTime begin, DateTime end) { try { if (!this.StartState) { return null; } Dictionary<string, IList<object>> result = new Dictionary<string, IList<object>>(); string query = "select {0} from {1} where EquipCode = '{2}' and time >= '{3:yyyy-MM-dd HH:mm:ss}' and time <= '{4:yyyy-MM-dd HH:mm:ss}'"; query = String.Format(query, String.Join(",", columnList.ToArray()), this.mixCurveTableName, equipCode, begin, end); Task<IEnumerable<InfluxData.Net.InfluxDb.Models.Responses.Serie>> task = this.Client.Client.QueryAsync(query, this.curveDbName, null, null); if (task != null && task.Result != null) { InfluxData.Net.InfluxDb.Models.Responses.Serie serie = task.Result.FirstOrDefault<InfluxData.Net.InfluxDb.Models.Responses.Serie>(); if (serie != null) { for (int i = 0; i < serie.Columns.Count; i++) { result.Add(serie.Columns[i], serie.Values[i]); } } } return result; } catch (Exception ex) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("从曲线数据库获取数据异常:" + ex.Message, ex); } return null; } /// <summary> /// 从曲线数据库获取数据 /// </summary> /// <param name="tableName">要读取的表名</param> /// <param name="equipCode">机台编号</param> /// <param name="unitNum">设备编号</param> /// <param name="columnList">要查询的字段列表</param> /// <param name="begin">开始时间</param> /// <param name="end">结束时间</param> /// <returns>返回对应的曲线数据</returns> public Dictionary<string, IList<object>> GetDataFromCurveDb(string tableName, string equipCode, string unitNum, List<string> columnList, DateTime begin, DateTime end) { try { if (!this.StartState) { return null; } Dictionary<string, IList<object>> result = new Dictionary<string, IList<object>>(); string query = "select {0} from {1} where EquipCode = '{2}' and UnitNum = '{3}' and time >= '{4:yyyy-MM-dd HH:mm:ss}' and time <= '{5:yyyy-MM-dd HH:mm:ss}'"; string fields = "*"; if (columnList != null && columnList.Count > 0) { fields = String.Join(",", columnList.ToArray()); } query = String.Format(query, fields, tableName, equipCode, unitNum, begin, end); Task<IEnumerable<InfluxData.Net.InfluxDb.Models.Responses.Serie>> task = this.Client.Client.QueryAsync(query, this.curveDbName, null, null); if (task != null && task.Result != null) { InfluxData.Net.InfluxDb.Models.Responses.Serie serie = task.Result.FirstOrDefault<InfluxData.Net.InfluxDb.Models.Responses.Serie>(); if (serie != null) { for (int i = 0; i < serie.Columns.Count; i++) { result.Add(serie.Columns[i], serie.Values[i]); } } } return result; } catch (Exception ex) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("从曲线数据库获取数据异常:" + ex.Message, ex); } return null; } /// <summary> /// 从曲线数据库获取数据 /// </summary> /// <param name="columnList">字段列表</param> /// <param name="begin">开始时间</param> /// <param name="end">结束时间</param> /// <returns>返回对应的曲线数据</returns> public Dictionary<string, IList<object>> GetDataFromCurveDb(List<string> columnList, DateTime begin, DateTime end) { try { if (!this.StartState) { return null; } Dictionary<string, IList<object>> result = new Dictionary<string, IList<object>>(); string query = "select {0} from {1} where time >= '{2:yyyy-MM-dd HH:mm:ss}' and time <= '{3:yyyy-MM-dd HH:mm:ss}'"; string fields = "*"; if (columnList != null && columnList.Count > 0) { fields = String.Join(",", columnList.ToArray()); } query = String.Format(query, fields, this.mixCurveTableName, begin, end); Task<IEnumerable<InfluxData.Net.InfluxDb.Models.Responses.Serie>> task = this.Client.Client.QueryAsync(query, this.curveDbName, null, null); if (task != null && task.Result != null) { InfluxData.Net.InfluxDb.Models.Responses.Serie serie = task.Result.FirstOrDefault<InfluxData.Net.InfluxDb.Models.Responses.Serie>(); if (serie != null) { for (int i = 0; i < serie.Columns.Count; i++) { result.Add(serie.Columns[i], serie.Values[i]); } } } return result; } catch (Exception ex) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("从曲线数据库获取数据异常:" + ex.Message, ex); } return null; } /// <summary> /// 从曲线数据库获取数据 /// </summary> /// <param name="tableName">要读取的表名</param> /// <param name="unitNum">设备编号</param> /// <param name="columnList">字段列表</param> /// <param name="begin">开始时间</param> /// <param name="end">结束时间</param> /// <returns>返回对应的曲线数据</returns> public Dictionary<string, IList<object>> GetDataFromCurveDb(string tableName, string unitNum, List<string> columnList, DateTime begin, DateTime end) { try { if (!this.StartState) { return null; } Dictionary<string, IList<object>> result = new Dictionary<string, IList<object>>(); string query = "select {0} from {1} where UnitNum = '{2}' and time >= '{3:yyyy-MM-dd HH:mm:ss}' and time <= '{4:yyyy-MM-dd HH:mm:ss}'"; string fields = "*"; if (columnList != null && columnList.Count > 0) { fields = String.Join(",", columnList.ToArray()); } query = String.Format(query, fields, tableName, unitNum, begin, end); Task<IEnumerable<InfluxData.Net.InfluxDb.Models.Responses.Serie>> task = this.Client.Client.QueryAsync(query, this.curveDbName, null, null); if (task != null && task.Result != null) { InfluxData.Net.InfluxDb.Models.Responses.Serie serie = task.Result.FirstOrDefault<InfluxData.Net.InfluxDb.Models.Responses.Serie>(); if (serie != null) { for (int i = 0; i < serie.Columns.Count; i++) { result.Add(serie.Columns[i], serie.Values[i]); } } } return result; } catch (Exception ex) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("从曲线数据库获取数据异常:" + ex.Message, ex); } return null; } #endregion #region 把数据集合转化为DataTable /// <summary> /// 把数据集合转化为DataTable /// </summary> /// <param name="data">要转化的数据集合</param> /// <returns>返回转化后的DataTable对象</returns> public static DataTable ConvertDicToDataTable(Dictionary<string, IList<object>> data) { DataTable dt = new DataTable(); if (data != null && data.Count > 0) { string lastKey = String.Empty; foreach(string key in data.Keys) { lastKey = key; dt.Columns.Add(key, typeof(object)); } for (int i = 0; i < data[lastKey].Count; i++) { DataRow row = dt.NewRow(); foreach(string key in data.Keys) { if (i < data[key].Count) { row[key] = data[key][i]; } else { row[key] = 0; } } dt.Rows.Add(row); } } return dt; } #endregion #region 从回放数据库获取数据 /// <summary> /// 从回放数据库获取数据 /// </summary> /// <param name="tableName">回放数据表名称</param> /// <param name="columnList">字段列表</param> /// <param name="time">回放时间点</param> /// <returns>返回对应时间点的回放数据</returns> public Dictionary<string, IList<object>> GetDataFromBackViewDb(string tableName, List<string> columnList, DateTime time) { try { if (!this.StartState) { return null; } Dictionary<string, IList<object>> result = new Dictionary<string, IList<object>>(); string query = "select {0} from {1}.{2} where time = '{3:yyyy-MM-dd HH:mm:ss}'"; string fields = "*"; if (columnList != null && columnList.Count > 0) { fields = String.Join(",", columnList.ToArray()); } query = String.Format(query, fields, this.backViewRetentionPolicyName, tableName, time); Task<IEnumerable<InfluxData.Net.InfluxDb.Models.Responses.Serie>> task = this.Client.Client.QueryAsync(query, this.BackViewDbName, null, null); if (task != null && task.Result != null) { InfluxData.Net.InfluxDb.Models.Responses.Serie serie = task.Result.FirstOrDefault<InfluxData.Net.InfluxDb.Models.Responses.Serie>(); if (serie != null) { for (int i = 0; i < serie.Columns.Count; i++) { result.Add(serie.Columns[i], serie.Values[i]); } } } return result; } catch (Exception ex) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("从回放数据库获取数据异常:" + ex.Message, ex); } return null; } /// <summary> /// 从回放数据库获取数据 /// </summary> /// <param name="time">回放时间点</param> /// <returns>返回对应回放时间点的回放数据</returns> public Dictionary<string, IList<object>> GetDataFromBackViewDb(DateTime time) { try { if (!this.StartState) { return null; } Dictionary<string, IList<object>> result = new Dictionary<string, IList<object>>(); string query = "select {0} from {1}.{2} where time = '{3:yyyy-MM-dd HH:mm:ss}'"; string fields = "*"; query = String.Format(query, fields, this.backViewRetentionPolicyName, this.backViewTableName, time); Task<IEnumerable<InfluxData.Net.InfluxDb.Models.Responses.Serie>> task = this.Client.Client.QueryAsync(query, this.BackViewDbName, null, null); if (task != null && task.Result != null) { InfluxData.Net.InfluxDb.Models.Responses.Serie serie = task.Result.FirstOrDefault<InfluxData.Net.InfluxDb.Models.Responses.Serie>(); if (serie != null) { for (int i = 0; i < serie.Columns.Count; i++) { result.Add(serie.Columns[i], serie.Values[i]); } } } return result; } catch (Exception ex) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("从回放数据库获取数据异常:" + ex.Message, ex); } return null; } #endregion #region 从InfluxDb数据库获取数据 /// <summary> /// 从InfluxDb数据库获取数据 /// </summary> /// <param name="dbName">数据库名称</param> /// <param name="tableName">表名称</param> /// <param name="columnList">字段列表</param> /// <param name="time">时间条件yyyy-MM-dd HH:mm:ss</param> /// <param name="limit">限制返回结果的最大条数</param> /// <returns>返回符合条件的n条数据</returns> public List<Dictionary<string, object>> GetData(string dbName, string tableName, List<string> columnList, DateTime time, int limit) { try { if (!this.StartState) { return null; } List<Dictionary<string, object>> result = new List<Dictionary<string, object>>(); string query = "select {0} from {1} where time > '{2:yyyy-MM-dd HH:mm:ss}' limit {3}"; string fields = "*"; if (columnList != null && columnList.Count > 0) { fields = String.Join(",", columnList.ToArray()); } query = String.Format(query, fields, tableName, time, limit); Task<IEnumerable<InfluxData.Net.InfluxDb.Models.Responses.Serie>> task = this.Client.Client.QueryAsync(query, dbName, null, null); if (task != null && task.Result != null) { InfluxData.Net.InfluxDb.Models.Responses.Serie serie = task.Result.FirstOrDefault<InfluxData.Net.InfluxDb.Models.Responses.Serie>(); if (serie != null) { Dictionary<string, object> data = null; for (int i = 0; i < limit; i++) { data = new Dictionary<string, object>(); for (int colIndex = 0; colIndex < serie.Columns.Count; colIndex++) { data.Add(serie.Columns[colIndex], serie.Values[i][colIndex]); } result.Add(data); } } } return result; } catch (Exception ex) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error("从InfluxDb数据库获取数据异常:" + ex.Message, ex); } return null; } /// <summary> /// 从InfluxDb数据库获取数据 /// </summary> /// <param name="dbName">数据库名称</param> /// <param name="retentionPolicyName">数据保存策略</param> /// <param name="tableName">数据表</param> /// <param name="columnList">字段列表</param> /// <param name="time">时间条件yyyy-MM-dd HH:mm:ss</param> /// <param name="limit">限制返回结果的最大条数</param> /// <returns>返回符合条件的n条数据</returns> public List<Dictionary<string, object>> GetData(string dbName, string retentionPolicyName, string tableName, List<string> columnList, DateTime time, int limit) { try { if (!this.StartState) { return null; } List<Dictionary<string, object>> result = new List<Dictionary<string, object>>(); string query = "select {0} from {1}.{2} where time > '{3:yyyy-MM-dd HH:mm:ss}' limit {4}"; string fields = "*"; if (columnList != null && columnList.Count > 0) { fields = String.Join(",", columnList.ToArray()); } query = String.Format(query, fields, retentionPolicyName, tableName, time, limit); Task<IEnumerable<InfluxData.Net.InfluxDb.Models.Responses.Serie>> task = this.Client.Client.QueryAsync(query, dbName, null, null); if (task != null && task.Result != null) { InfluxData.Net.InfluxDb.Models.Responses.Serie serie = task.Result.FirstOrDefault<InfluxData.Net.InfluxDb.Models.Responses.Serie>(); if (serie != null) { Dictionary<string, object> data = null; for (int i = 0; i < limit; i++) { data = new Dictionary<string, object>(); for (int colIndex = 0; colIndex < serie.Columns.Count; colIndex++) { data.Add(serie.Columns[colIndex], serie.Values[i][colIndex]); } result.Add(data); } } } return result; } catch (Exception ex) { ICSharpCode.Core.LoggingService<InfluxDbHelper>.Error(String.Format("从InfluxDb数据库{0}.{1}.{2}中获取数据异常: {3}", dbName, retentionPolicyName, tableName, ex.Message), ex); } return null; } #endregion #endregion } }