1. 项目概述
TDengine作为一款专为物联网场景设计的高性能时序数据库,在工业互联网、车联网、能源监控等领域有着广泛应用。最近我在一个工业设备监控项目中,需要在.NET Core平台上实现高效的数据查询功能,经过多轮技术选型后最终选择了TDengine。本文将分享TDengine在.NET Core环境中的完整集成方案,包含从驱动配置到复杂查询优化的全流程实战经验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与驱动配置
2.1 基础环境搭建
在开始集成前需要准备以下环境:
- TDengine 2.6+ 服务端(建议使用最新稳定版)
- .NET Core 3.1/5.0/6.0 开发环境
- Visual Studio 2019/2022 或 Rider 开发工具
注意:TDengine的Windows客户端版本与Linux版本存在差异,生产环境建议使用Linux部署
2.2 驱动安装方案对比
目前.NET Core连接TDengine主要有三种方式:
| 方案类型 | 实现方式 | 优点 | 缺点 |
|---|---|---|---|
| RESTful | 通过HTTP API调用 | 无需安装客户端 | 性能较低 |
| JDBC | 使用JNI桥接 | 功能完整 | 配置复杂 |
| Native | 官方C#驱动 | 原生高性能 | 需编译驱动 |
我们选择官方提供的C#原生驱动(taos.dll)方案,通过NuGet安装依赖包:
bash复制dotnet add package TDengine.Connector
2.3 连接字符串配置
在appsettings.json中配置连接字符串:
json复制{
"TDengine": {
"Host": "192.168.1.100",
"Port": 6030,
"Username": "root",
"Password": "taosdata",
"DBName": "iot_data"
}
}
建议使用ConfigurationBuilder加载配置:
csharp复制var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
3. 核心查询功能实现
3.1 基础查询封装
创建TDengineHelper工具类处理连接生命周期:
csharp复制public class TDengineHelper : IDisposable
{
private readonly TDengineConnection _connection;
public TDengineHelper(IConfiguration config)
{
var connStr = $"host={config["TDengine:Host"]};" +
$"port={config["TDengine:Port"]};" +
$"username={config["TDengine:Username"]};" +
$"password={config["TDengine:Password"]};" +
$"dbname={config["TDengine:DBName"]}";
_connection = new TDengineConnection(connStr);
_connection.Open();
}
public DataTable ExecuteQuery(string sql)
{
using var cmd = new TDengineCommand(sql, _connection);
using var reader = cmd.ExecuteReader();
var dt = new DataTable();
dt.Load(reader);
return dt;
}
public void Dispose()
{
_connection?.Close();
}
}
3.2 时序数据查询优化
针对TDengine的时序特性,需要特别注意以下查询模式:
- 时间区间查询:必须包含时间范围条件
sql复制SELECT * FROM device_data
WHERE ts >= '2023-01-01 00:00:00'
AND ts <= '2023-01-02 00:00:00'
- 降采样查询:使用INTERVAL和FILL处理空缺数据
sql复制SELECT AVG(temperature)
FROM device_data
WHERE ts >= NOW - 1d
GROUP BY INTERVAL(10m)
FI
