linux下使用ODBC连接器采用参数绑定方式插入unsigned数据失败

【TDengine 使用环境】
测试

【TDengine 版本】

3.3.6.9

【操作系统以及版本】

20.04.1-Ubuntu

【部署方式】非容器部署

【遇到的问题:问题现象及影响】

我linux下使用https://github.com/taosdata/taos-connector-odbc中实现的odbc连接器,在采用SQLBindParameter的方式实现数据批量插入,对超级表中无符号类型如INT UNSIGNED的列,指定C类型为SQL_C_ULONG,SQL类型为SQL_INTEGER时函数返回_stmt_bind_param(): General error:#3 Parameter converstion from `SQL_C_ULONG[0xffffffee/-18]` to `SQL_INTEGER[0x4/4]` not implemented yet。请问这个问题该如何解决或能否绕过。

对于SQL类型 SQL_INTEGER 推荐C类型使用 SQL_C_LONG 或 SQL_C_UBIGINT

非常感谢回复。

  1. 指定C类型为SQL_C_LONG,SQL类型为SQL_INTEGER时(对应绑定了uint32_t*类型的地址)时,SQLExecute执行返回stmt.c[7535]:_stmt_param_tsdb_init(): General error:#3 Parameter `SQL_C_LONG[0x4/4]:SQL_INTEGER[0x4/4]:TSDB_DATA_TYPE_UINT[0xd/13]` not implemented yet。
  2. 指定C类型为SQL_C_UBIGINT,SQL类型为SQL_INTEGER时(对应绑定了uint64_t*类型的地址)时,有_stmt_bind_param(): General error:#3 Parameter converstion from `SQL_C_UBIGINT[0xffffffe5/-27]` to `SQL_INTEGER[0x4/4]` not implemented yet ]

你好,经查询,如报错提示所示,目前odbc对int unsigned的类型支持有限,仅支持c类型和sql类型分别是:SQL_C_CHAR, SQL_VARCHAR。建议的临时方案:

  1. 数据库使用int类型,可使用的c类型和sql类型组合是:SQL_C_LONG, SQL_INTEGER;
    2.数据库使用bigint类型,可使用的c类型和sql类型组合是:SQL_C_SBIGINT, SQL_BIGINT;

int unsigned和SQL_C_CHAR, SQL_VARCHAR一起是什么使用场景?

数据来源是字符串,例如:”1452”

好的,谢谢。

我们在taos-connector-odbc-main/src/core/stmt.c中

照着:

{SQL_C_LONG, SQL_INTEGER, TSDB_DATA_TYPE_INT,

\_stmt_param_adjust_reuse_sqlc_long,

\_stmt_param_conv_dummy},

添加了:

{SQL_C_LONG, SQL_INTEGER, TSDB_DATA_TYPE_UINT,

\_stmt_param_adjust_reuse_sqlc_long,

\_stmt_param_conv_dummy},

然后对int unsigned使用SQL_C_LONG, SQL_INTEGER,然后就能正常使用绑定参数的方式插入数据了。(我们也用类似的方式处理了tinyint unsigned及smallint unsigned)

请问这种修改方式会不会有什么问题?

修改的位置正确,可以在这里补充不支持类型,相同位数的有符合和无符号内存布局相同,测试写入数据和实际存储数据一致就没问题

ok。

再问一个别的问题:使用ODBC连接器如何指定使用原生连接/WebSocket?

原生连接默认端口为 6030,WebSocket 连接默认端口为 6041。

我现在ODBC连接器使用的是6030接口能连接数据库,但使用6041连不上。

使用WebSocket连接需要配置DSN的连接类型为WebSocket,并确保taosAdapter正常工作。

我在linux下使用的类似–conn ‘DRIVER=/usr/lib/libtaos_odbc.so;SERVER=127.0.0.1:6030;UID=root;PWD=taosdata;DATABASE=foo’的方式指定的。这种能指定websocket连接吗?

WebSocket方式需将SERVER部分替换成URL,如:URL=http://127.0.0.1:6041;

我这里有错误:conn.c[858]:conn_driver_connect(): General error:parsing:DRIVER=/usr/lib/libtaos_odbc.so;URL=http://localhost:6041;UID=root;PWD=taosdata;

  • DRIVER 字段应填写 已注册的驱动名称(即 DSN 配置中的驱动段名),而不是文件路径。

  • 驱动的实际路径应在系统配置文件中定义。

好的,谢谢。 还有一个问题 :innocent: 。现在odbc连接器对应的动态库libtaos_odbc.so需要动态链接libtaos.so及libtaosws.so(C/C++连接器)? 也就是说ODBC连接器还是依赖C/C++连接器的实现?

是的,存在依赖关系。

1 个赞