基类:
/// <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;
}
}