InfluxDB通用方法

基类:
/// <summary>
    /// Influx基类
    /// </summary>
    public abstract class InfluxDBBase
    {
        /// <summary>
        /// 数据库名称
        /// </summary>
        public string DatabaseName { get; set; }
        /// <summary>
        /// 连接地址
        /// </summary>
        public string Url { get; set; }
        /// <summary>
        /// 账号
        /// </summary>
        public string UserID { get; set; }
        /// <summary>
        /// 密码
        /// </summary>
        public string UserPwd { get; set; }
        /// <summary>
        /// 保留数据时限(单位:"ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w")
        /// </summary>
        public string Duration { get; set; }
        /// <summary>
        /// 获取时间戳
        /// </summary>
        /// <returns>UTC格式的时间戳</returns>
        public long GetTimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalMilliseconds);
        }
        /// <summary>
        /// 获取时间戳
        /// </summary>
        /// <param name="ADateTime">日期</param>
        /// <returns>UTC格式的时间戳</returns>
        public long GetTimeStamp(DateTime ADateTime)
        {
            TimeSpan ts = DateTime.SpecifyKind(ADateTime, DateTimeKind.Utc) - new DateTime(1970, 1, 1, 8, 0, 0, 0);
            return Convert.ToInt64(ts.TotalMilliseconds);
        }
        /// <summary>
        /// 转换时间戳为C#时间
        /// </summary>
        /// <param name="ATimeStamp">时间戳 单位:毫秒</param>
        /// <returns>C#时间格式</returns>
        public DateTime ConvertTimeStampToDateTime(long ATimeStamp)
        {
            DateTime vStartTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区
            DateTime vDateTime = vStartTime.AddMilliseconds(ATimeStamp);
            return vDateTime;
        }
        /// <summary>
        /// 创建数据库
        /// </summary>
        public abstract void CreateDatabase();
        /// <summary>
        /// 创建保留策略
        /// </summary>
        /// <param name="AName">策略名称</param>
        /// <param name="ADuration">时长(带单位,h/m/s)</param>
        /// <param name="AReplicationCopies">副本个数</param>
        /// <returns>返回布尔值</returns>
        public abstract Task<bool> CreateRetentionPolicy(string AName, string ADuration = "168h", int AReplicationCopies = 1);
        /// <summary>
        /// 修改保留策略
        /// </summary>
        /// <param name="AName">策略名称</param>
        /// <param name="ADuration">时长(带单位,h/m/s)</param>
        /// <param name="AReplicationCopies">副本个数</param>
        /// <returns>返回布尔值</returns>
        public abstract Task<bool> AlterRetentionPolicy(string AName, string ADuration = "168h", int AReplicationCopies = 1);
        /// <summary>
        /// 删除保留策略
        /// </summary>
        /// <param name="AName">策略名称</param>
        /// <returns>返回布尔值</returns>
        public abstract Task<bool> DropRetentionPolicy(string AName);
        /// <summary>
        /// 插入数据
        /// </summary>
        /// <param name="ATableName">表名</param>
        /// <param name="ADict">数据项</param>
        /// <returns>返回布尔值</returns>
        public abstract Task<bool> Insert(string ATableName, Dictionary<Dictionary<string, object>, Dictionary<string, object>> ADict);
        /// <summary>
        /// 查询数据
        /// </summary>
        /// <param name="ASql"></param>
        /// <returns>返回单表数据</returns>
        public abstract Task<DataTable> Query(string ASql);
        /// <summary>
        /// 查询多条SQL语句
        /// </summary>
        /// <param name="ASqls"></param>
        /// <returns>返回多个表的结果</returns>
        public abstract Task<List<DataTable>> MultiQuery(List<string> ASqls);
        /// <summary>
        /// 转化成表格数据
        /// </summary>
        /// <param name="ASerie"></param>
        /// <returns></returns>
        protected DataTable GetDataTable(Serie ASerie)
        {
            DataTable vDt = new DataTable();
            if (ASerie == null)
                return vDt;
            for (int i = 0; i < ASerie.Columns.Count; i++)
            {
                vDt.Columns.Add(ASerie.Columns[i]);
            }
            foreach (var vItem in ASerie.Values)
            {
                DataRow vDr = vDt.NewRow();
                for (int i = 0; i < vItem.Count; i++)
                {
                    vDr[i] = vItem[i];
                }
                vDt.Rows.Add(vDr);
            }
            vDt.TableName = ASerie.Name;
            return vDt;
        }
    }

实现类:
/// <summary>
    /// InfluxDB操作类
    /// </summary>
    public class InfluxDBOperate : InfluxDBBase
    {
        /// <summary>
        /// InfluxDB客户端
        /// </summary>
        private InfluxData.Net.InfluxDb.InfluxDbClient InfluxDbCurrentClient { get; set; }
        /// <summary>
        /// InfluxDB操作类
        /// </summary>
        public InfluxDBOperate()
        {
            DatabaseName = ConfigCenter.JYTInfluxDBConfigInstance().InfluxDatabaseName;
            Url = ConfigCenter.JYTInfluxDBConfigInstance().InfluxUrl;
            UserID = ConfigCenter.JYTInfluxDBConfigInstance().InfluxUser;
            UserPwd = ConfigCenter.JYTInfluxDBConfigInstance().InfluxPwd;
            Duration = ConfigCenter.JYTInfluxDBConfigInstance().Duration;
            Connect();
        }
        /// <summary>
        /// 连接InfluxDbClient
        /// </summary>
        private void Connect()
        {
            InfluxDbCurrentClient = new InfluxData.Net.InfluxDb.InfluxDbClient(Url, UserID, UserPwd, InfluxData.Net.Common.Enums.InfluxDbVersion.Latest);
            //创建数据库
            CreateDatabase();
        }
        #region 保存策略相关方法
        /// <summary>
        /// 创建数据库
        /// </summary>
        public override void CreateDatabase()
        {
            var vList = InfluxDbCurrentClient.Database.GetDatabasesAsync();
            var vDatabase = vList.Result.FirstOrDefault(P => P.Name == DatabaseName);
            if (vDatabase == null)
            {
                //创建数据库
                var vRes = InfluxDbCurrentClient.Database.CreateDatabaseAsync(DatabaseName);
                if (vRes.Result.Success)
                {
                    //创建保留策略
                    CreateRetentionPolicy("7_day", Duration);
                }
            }
        }
        /// <summary>
        /// 创建保留策略
        /// </summary>
        /// <param name="AName">策略名称</param>
        /// <param name="ADuration">时长(带单位,h/m/s)</param>
        /// <param name="AReplicationCopies">副本个数</param>
        /// <returns>返回布尔值</returns>
        public override async Task<bool> CreateRetentionPolicy(string AName, string ADuration = "168h", int AReplicationCopies = 1)
        {
            var vRes = await InfluxDbCurrentClient.Retention.CreateRetentionPolicyAsync(DatabaseName, AName, ADuration, AReplicationCopies);
            return vRes.Success;
        }
        /// <summary>
        /// 修改保留策略
        /// </summary>
        /// <param name="AName">策略名称</param>
        /// <param name="ADuration">时长(带单位,h/m/s)</param>
        /// <param name="AReplicationCopies">副本个数</param>
        /// <returns>返回布尔值</returns>
        public override async Task<bool> AlterRetentionPolicy(string AName, string ADuration = "168h", int AReplicationCopies = 1)
        {
            var vRes = await InfluxDbCurrentClient.Retention.AlterRetentionPolicyAsync(DatabaseName, AName, ADuration, AReplicationCopies);
            return vRes.Success;
        }
        /// <summary>
        /// 删除保留策略
        /// </summary>
        /// <param name="AName">策略名称</param>
        /// <returns>返回布尔值</returns>
        public override async Task<bool> DropRetentionPolicy(string AName)
        {
            var vRes = await InfluxDbCurrentClient.Retention.DropRetentionPolicyAsync(DatabaseName, AName);
            return vRes.Success;
        }
        #endregion
        /// <summary>
        /// 插入数据
        /// </summary>
        /// <param name="ATableName">表名</param>
        /// <param name="ADict">数据项(Tags-Fields)</param>
        /// <returns>返回布尔值</returns>
        public override async Task<bool> Insert(string ATableName, Dictionary<Dictionary<string, object>, Dictionary<string, object>> ADict)
        {
            List<Point> vList = new List<Point>();
            int vIndex = 0;
            foreach (var vItem in ADict)
            {
                vList.Add(new Point
                {
                    Fields = vItem.Value,
                    Name = ATableName,
                    Tags = vItem.Key,
                    Timestamp = DateTime.Now.AddMilliseconds(++vIndex)
                });
            }
            var vRes = await InfluxDbCurrentClient.Client.WriteAsync(vList, DatabaseName);
            return vRes.Success;
        }
        /// <summary>
        /// 查询数据
        /// </summary>
        /// <param name="ASql"></param>
        /// <returns>返回单表数据</returns>
        public override async Task<DataTable> Query(string ASql)
        {
            var vRes = await InfluxDbCurrentClient.Client.QueryAsync(ASql, DatabaseName);
            var vData = vRes.ToList().FirstOrDefault();
            DataTable vDt = GetDataTable(vData);
            return vDt;
        }
        /// <summary>
        /// 查询多条SQL语句
        /// </summary>
        /// <param name="ASqls"></param>
        /// <returns>返回多个表的结果</returns>
        public override async Task<List<DataTable>> MultiQuery(List<string> ASqls)
        {
            var vRes = await InfluxDbCurrentClient.Client.MultiQueryAsync(ASqls, DatabaseName);
            List<DataTable> vDataList = new List<DataTable>();
            foreach (var vItem in vRes)
            {
                vDataList.Add(GetDataTable(vItem.ToList().FirstOrDefault()));
            }
            return vDataList;
        }
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值