C# 读写influxdb时序数据库+解析json格式的数据

之前因为数据量过大,尝试各种存储方式,运用到了influxdb,发现对于C#使用这些第三方数据存储,真的是不太友好。哎。

重振C#荣光,我辈义不容辞!

先下载好influxdb(不会真的有人不会吧?)

C# 读写influxdb时序数据库+解析json格式的数据_第1张图片
运行influxd,启动服务端
C# 读写influxdb时序数据库+解析json格式的数据_第2张图片
启动成功后

(接下来的操作只是为了添加一点数据)
启动客服端,运行influx,可以百度下influxdb的用法
C# 读写influxdb时序数据库+解析json格式的数据_第3张图片
创建一个数据库test,查看数据库
然后直接插入一条数据
C# 读写influxdb时序数据库+解析json格式的数据_第4张图片

接下来就是在C#中如何使用了
先添加一个辅助类 HttpHelper

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Net;
 using System.Text;
 using System.Threading.Tasks;
  
  public class HttpHelper
 {
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    public static string Get(string uri, string username, string password)
    {
        string result = string.Empty;

        WebClient client = new WebClient();

        if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
        {
            client.Credentials = GetCredentialCache(uri, username, password);
            client.Headers.Add("Authorization", GetAuthorization(username, password));
        }
        return client.DownloadString(uri);
    } 

    /// 
    /// 
    /// 
    /// 
     /// 
    /// 
     /// 
     /// 
     public static string Post(string uri, string paramStr, string username, string password)
     {
        string result = string.Empty;
         WebClient client = new WebClient();
         // 采取POST方式必须加的Header
         client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
         byte[] postData = Encoding.UTF8.GetBytes(paramStr);
        if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
         {
            client.Credentials = GetCredentialCache(uri, username, password);
             client.Headers.Add("Authorization", GetAuthorization(username, password));
        }
         byte[] responseData = client.UploadData(uri, "POST", postData); // 得到返回字符流       
         return Encoding.UTF8.GetString(responseData);// 解码            
     } 
     private static CredentialCache GetCredentialCache(string uri, string username, string password)
     {
         string authorization = string.Format("{0}:{1}", username, password);

        CredentialCache credCache = new CredentialCache();
         credCache.Add(new Uri(uri), "Basic", new NetworkCredential(username, password));
        return credCache;
     }
     private static string GetAuthorization(string username, string password)
     {
         string authorization = string.Format("{0}:{1}", username, password);
         return "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(authorization));
     }   
}

再添加一个辅助类 InfluxDBClient

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Net.Http;
 using System.Security.Cryptography.X509Certificates;

public class InfluxDBClient
 {
    string _baseAddress;
    string _username;
    string _password;
    /// 
    /// 构造函数
    /// 
    /// 
    /// 
    /// 
    public InfluxDBClient(string baseAddress, string username, string password)
    {
        this._baseAddress = baseAddress;
        this._username = username;
        this._password = password;
    }



    /// 
    /// 读
    /// 
    /// 
    /// 
    /// 
    public string Query(string database, string sql)
    {
        string pathAndQuery = string.Format("/query?db={0}&q={1}", database, sql);
        string url = _baseAddress + pathAndQuery;
        string result = HttpHelper.Get(url, _username, _password);
        return result;
    }
  
    /// 
     /// 写
     /// 
    /// 
     /// 
    /// 
     public string Write(string database, string sql)
     {
       string pathAndQuery = string.Format("/write?db={0}", database);
        string url = _baseAddress + pathAndQuery; 
        string result = HttpHelper.Post(url, sql, _username, _password);
        return result;
     }
 }

接下来就是读取influxdb中的数据

  InfluxDBClient db = new InfluxDBClient("http://localhost:8086", "root", "root");
            string sql = string.Format("select * from workday");           
            string result = db.Query("test", sql); //数据库名,查询语句

此时查询出来的result是json格式的数据,格式如下:

{"results":[{"statement_id":0,"series":[{"name":"workday","columns":["time","mood","state","week"],"values":[["2021-05-28T02:45:58.9963685Z",1,0,"monday"]]}]}]}

可以看到,其实结果已经查出来了,只要解析JSON格式的数据就可以了。
用到一个辅助的工具,解析起来更快!(https://www.bejson.com/convert/json2csharp/)
json转C#实体类
C# 读写influxdb时序数据库+解析json格式的数据_第5张图片
生成实体类后,将实体类写入程序。

public class SeriesItem
    {
        /// 
        /// 
        /// 
        public string name { get; set; }
        /// 
        /// 
        /// 
        public List<string> columns { get; set; }
        /// 
        /// 
        /// 
        public List<List<string>> values { get; set; }
    }

    public class ResultsItem
    {
        /// 
        /// 
        /// 
        public int statement_id { get; set; }
        /// 
        /// 
        /// 
        public List<SeriesItem> series { get; set; }
    }

    public class Root
    {
        /// 
        /// 
        /// 
        public List<ResultsItem> results { get; set; }
    }

然后开始解析JSON格式的数据

   Root rt =JsonConvert.DeserializeObject<Root>(result);

这个JsonConvert,不会还有人不知道怎么添加吧?

啊?不会吧?

可能有很多的方法,这边是直接找一个json的dll,然后添加引用就可以了

在这里插入图片描述
C# 读写influxdb时序数据库+解析json格式的数据_第6张图片
C# 读写influxdb时序数据库+解析json格式的数据_第7张图片
C# 读写influxdb时序数据库+解析json格式的数据_第8张图片
这边可以看到要的数据已经都加载到了这个类里面了,自己去里面拿就可以了。(不会这也不会吧?)

接下来就是写了
添加一条数据

  InfluxDBClient db = new InfluxDBClient("http://localhost:8086", "root", "root");               
            string cmd = string.Format("workday,week=monday mood=3,state=2");
            db.Write("test", cmd);//

注意的是,此处要省略insert, 在客户端的完整插入语句为insert workday,week=monday mood=3,state=2,写在此处要省略insert 。
执行后,查看数据库:
C# 读写influxdb时序数据库+解析json格式的数据_第9张图片
可以看到数据已经插入进来了。可以看到time处代表的是该条数据记录的时间,我们再插入语句时没写时间,默认的就是当前时间。那如果想指定一个时间去记录,该如何做呢?
只要再插入语句后面写入时间就可以了,但是时间要写成这种一长串的时间。具体含义可以百度下。
示例:

InfluxDBClient db = new InfluxDBClient("http://localhost:8086", "root", "root");
long _time = (DateTime.Now.AddDays(1).ToUniversalTime().Ticks - 621355968000000000) * 100;
string cmd = string.Format("workday,week=monday mood=5,state=4 {0}",_time);
db.Write("test", cmd);//

查看数据库
C# 读写influxdb时序数据库+解析json格式的数据_第10张图片
用InfluxDBStudio(类似于mysql的三叶草软件)去看,就可以看出差别

C# 读写influxdb时序数据库+解析json格式的数据_第11张图片
C# 读写influxdb时序数据库+解析json格式的数据_第12张图片

C# 读写influxdb时序数据库+解析json格式的数据_第13张图片
C# 读写influxdb时序数据库+解析json格式的数据_第14张图片
差不多就是这些了。
最后附个influxdb和InfluxDBStudio的链接,下载即可使用。

链接:https://pan.baidu.com/s/168jLnoG2tZr_Ugp8TX1E4A
提取码:u7ub
复制这段内容后打开百度网盘手机App,操作更方便哦!

你可能感兴趣的:(C#调用第三方工具,c#,json)