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

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

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

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

在这里插入图片描述
运行influxd,启动服务端
在这里插入图片描述
启动成功后

(接下来的操作只是为了添加一点数据)
启动客服端,运行influx,可以百度下influxdb的用法
在这里插入图片描述
创建一个数据库test,查看数据库
然后直接插入一条数据
在这里插入图片描述

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

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Net;
 using System.Text;
 using System.Threading.Tasks;
  
  public class HttpHelper
 {
    /// <summary>
    /// 
    /// </summary>
    /// <param name="uri"></param>
    /// <param name="username"></param>
    /// <param name="password"></param>
    /// <returns></returns>
    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);
    } 

    /// <summary>
    /// 
    /// </summary>
    /// <param name="uri"></param>
     /// <param name="paramStr"></param>
    /// <param name="username"></param>
     /// <param name="password"></param>
     /// <returns></returns>
     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;
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="baseAddress"></param>
    /// <param name="username"></param>
    /// <param name="password"></param>
    public InfluxDBClient(string baseAddress, string username, string password)
    {
        this._baseAddress = baseAddress;
        this._username = username;
        this._password = password;
    }



    /// <summary>
    /// 读
    /// </summary>
    /// <param name="database"></param>
    /// <param name="sql"></param>
    /// <returns></returns>
    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;
    }
  
    /// <summary>
     /// 写
     /// </summary>
    /// <param name="database"></param>
     /// <param name="sql"></param>
    /// <returns></returns>
     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#实体类
在这里插入图片描述
生成实体类后,将实体类写入程序。

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

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

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

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

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

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

啊?不会吧?

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这边可以看到要的数据已经都加载到了这个类里面了,自己去里面拿就可以了。(不会这也不会吧?)

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

  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 。
执行后,查看数据库:
在这里插入图片描述
可以看到数据已经插入进来了。可以看到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);//

查看数据库
在这里插入图片描述
用InfluxDBStudio(类似于mysql的三叶草软件)去看,就可以看出差别

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
差不多就是这些了。
最后附个influxdb和InfluxDBStudio的链接,下载即可使用。

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

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
回答: 在C#中,可以使用JsonConvert类来处理JSON格式数据。引用\[1\]中的代码展示了将一组JSON格式数据转换为字符串进行显示的方法。首先,需要引入Newtonsoft.Json命名空间,并使用JsonConvert.DeserializeObject方法将JSON字符串转换为对象。然后,可以通过对象的属性来获取相应的值。例如,可以使用m.Name来获取Name属性的值。引用\[2\]中的代码展示了处理嵌套格式JSON数据的方法。同样地,可以使用JsonConvert.DeserializeObject方法将JSON字符串转换为JObject对象,然后通过索引来获取嵌套属性的值。引用\[3\]中的代码展示了使用DataContractJsonSerializer类来处理JSON格式数据的方法。首先,需要定义一个包含属性的类,并使用DataContractJsonSerializer类进行序列化和反序列化操作。通过将对象写入MemoryStream并将其转换为字符串,可以将对象转换为JSON格式的字符串。然后,可以使用DataContractJsonSerializer类的ReadObject方法将JSON字符串转换回对象。 #### 引用[.reference_title] - *1* [C#处理JSON格式数据](https://blog.csdn.net/zls365365/article/details/123321137)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C#解析json文件的方法](https://blog.csdn.net/u011555996/article/details/107348495)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yangzm996

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值