TDengine C# WebSocket 驱动中,IStmt.Prepare() 对无参数查询语句报错

【TDengine 使用环境】测试

【TDengine 版本】3.4.0.2

【操作系统以及版本】Linux

【部署方式】/非容器部署

问题描述

在使用 TDengine C# 驱动的 WebSocket 协议时,当调用 IStmt.Prepare() 准备一个 不包含参数占位符 ? 的查询语句时,会抛出异常。但如果在 SQL 中添加虚拟参数(如 WHERE ?=? ),则可以正常执行。分析是服务端传回的错误。错误内容为:【code:[0x2600],error:stmt only support select or insert at TDengine.Driver.Impl.WebSocketMethods.BaseConnection.WaitAndThrowOriginalException(Task task)】

其他环境信息

  • C# 驱动版本:最新
  • 连接协议:WebSocket
  • 操作系统:Windows

复现步骤 步骤 1:创建连接

using (var client = new WSClient(builder))
{
    // ...
}
``` 步骤 2:尝试准备无参数查询(失败)

using (var stmt = client.StmtInit())
{
// :cross_mark: 抛出 TDengineError 异常
stmt.Prepare(“SELECT * FROM meters”);
}

错误信息 :[请补充实际错误信息]
 步骤 3:准备带虚拟参数的查询(成功)

using (var stmt = client.StmtInit())
{
// :white_check_mark: 正常执行
stmt.Prepare(“SELECT * FROM meters WHERE ?=?”);
stmt.BindRow(new object { 1, 1 });
stmt.AddBatch();
stmt.Exec();

using (var rows = stmt.Result())
{
    while (rows.Read())
    {
        // 处理结果
    }
}

}


期望行为

IStmt.Prepare() 应该能够准备 不包含参数 的查询语句。

实际行为

  • 无参数查询: Prepare(“SELECT * FROM meters”) → 抛出异常
  • 有参数查询: Prepare(“SELECT * FROM meters WHERE id = ?”) → 正常执行

收到,会找我们的研发看下。

参数绑定不支持不带无?的sql语句, 如果需要执行普通sql,用taos_query

有道理,但是就得针对sql进行条件判断了。