之前因为数据量过大,尝试各种存储方式,运用到了influxdb,发现对于C#使用这些第三方数据存储,真的是不太友好。哎。
重振C#荣光,我辈义不容辞!
先下载好influxdb(不会真的有人不会吧?)
(接下来的操作只是为了添加一点数据)
启动客服端,运行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
{
///
///
///
///
///
///
///
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#实体类
生成实体类后,将实体类写入程序。
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,然后添加引用就可以了
这边可以看到要的数据已经都加载到了这个类里面了,自己去里面拿就可以了。(不会这也不会吧?)
接下来就是写了
添加一条数据
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,操作更方便哦!