From c74b09fe490f3b19a4be72942e572e7388dd5456 Mon Sep 17 00:00:00 2001 From: Yaming Pei Date: Fri, 27 Sep 2024 16:10:40 +0800 Subject: [PATCH 1/7] docs: updated odbc documentation to add API interfaces, supported data types, and compatible software options --- docs/zh/14-reference/05-connector/50-odbc.mdx | 171 ++++++++++++++++++ .../assets/odbc-native-config-zh.webp | Bin 15080 -> 10930 bytes .../assets/odbc-ws-config-zh.webp | Bin 15954 -> 11292 bytes 3 files changed, 171 insertions(+) diff --git a/docs/zh/14-reference/05-connector/50-odbc.mdx b/docs/zh/14-reference/05-connector/50-odbc.mdx index ee69cf9364..af3f79b0c6 100644 --- a/docs/zh/14-reference/05-connector/50-odbc.mdx +++ b/docs/zh/14-reference/05-connector/50-odbc.mdx @@ -60,6 +60,8 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:Websocket 连接与 4.6【密码】仅供第5步测试连接使用,选填,数据库用户密码,如果不填,TDengine 默认 taosdata + 4.7【兼容软件】支持对工业软件 KingSCADA、Kepware 等的兼容性适配,通常情况下,选择默认值 General 即可 + 5. 点【测试连接】测试连接情况,如果成功,提示"成功连接到URL" 6. 点【确定】,即可保存配置并退出 @@ -90,12 +92,181 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:Websocket 连接与 4.6 【密码】仅供第5步测试连接使用,选填,数据库用户密码,如果不填,TDengine 默认 taosdata + 4.7【兼容软件】支持对工业软件 KingSCADA、Kepware 等的兼容性适配,通常情况下,选择默认值 General 即可 + 5. 点【测试连接】测试连接情况,如果成功,提示"连接成功" 6. 点【确定】,即可保存配置并退出 7. 也可以在第2步选择已经配置好的数据源名通过【配置】按钮进入配置页面,修改已有配置 +## ODBC API 参考 + +本节按功能分类汇总了 ODBC API。 + +- 数据源和驱动程序管理 + +| API | 是否支持 | 标准 | 作用 | +|------------------|----------|------|------------------------------------------------------------------------------------------------| +| ConfigDSN | 支持 | ODBC | 配置数据源 | +| ConfigDriver | 支持 | ODBC | 用于执行与特定驱动程序相关的安装和配置任务 | +| ConfigTranslator | 支持 | ODBC | 用于解析DSN的配置,在DSN配置和实际数据库驱动程序配置之间进行翻译或转换 | + + +- 连接到数据源 + +| API | 是否支持 | 标准 | 作用 | +|------------------|----------|------|------------------------------------------------------------------------------------------------| +| SQLAllocHandle | 支持 | ISO 92 | 分配环境、连接、语句或描述符句柄 | +| SQLConnect | 支持 | ISO 92 | 通过数据源名称、用户 ID 和密码连接到特定驱动程序 | +| SQLDriverConnect| 支持 | ODBC | 通过连接字符串连接到特定驱动程序,支持更多连接信息 | +| SQLBrowseConnect | 不支持 | ODBC | 用于发现和枚举连接到数据源所需的特性和属性值。每次调用 SQLBrowseConnect 都会返回属性和属性值的连续级别 | +| SQLAllocEnv | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocEnv 已替换为 SQLAllocHandle | +| SQLAllocConnect | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocConnect 已替换为 SQLAllocHandle | + + +- 获取有关驱动程序和数据源的信息 + +| API | 是否支持 | 标准 | 作用 | +|------------------|----------|------|------------------------------------------------------------------------------------------------| +| SQLDataSources | 不支持 | ISO 92 | 返回可用数据源的列表,由驱动程序管理器处理 | +| SQLDrivers | 不支持 | ISO 92 | 返回由驱动程序管理器处理的已安装驱动程序及其属性的列表 | +| SQLGetInfo | 支持 | ISO 92 | 返回有关数据库环境的详细信息,如数据库产品名称、驱动程序名、数据库的SQL语法特性、连接能力等等 | +| SQLGetFunctions | 不支持 | ISO 92 | 用于查询驱动程序支持的函数 | +| SQLGetTypeInfo | 支持 | ISO 92 | 返回有关支持的数据类型的信息 | + + +- 设置和检索驱动程序属性 + +| API | 是否支持 | 标准 | 作用 | +|------------------|----------|------|------------------------------------------------------------------------------------------------| +| SQLSetConnectAttr| 支持 | ISO 92 | 设置连接属性,当设置SQL_ATTR_AUTOCOMMIT属性时,用于控制自动提交模式 | +| SQLGetConnectAttr| 支持 | ISO 92 | 返回连接属性的值 | +| SQLSetConnectOption| 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetConnectOption 已替换为 SQLSetConnectAttr | +| SQLGetConnectOption| 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetConnectOption 已替换为 SQLGetConnectAttr | +| SQLSetEnvAttr | 支持 | ISO 92 | 设置控制环境的属性 | +| SQLGetEnvAttr | 支持 | ISO 92 | 返回环境属性的当前设置 | +| SQLSetStmtAttr | 支持 | ISO 92 | 设置与语句相关的属性 | +| SQLGetStmtAttr | 支持 | ISO 92 | 返回语句属性的当前设置 | +| SQLSetStmtOption | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetStmtOption 已替换为 SQLSetStmtAttr | +| SQLGetStmtOption | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetStmtOption 已替换为 SQLGetStmtAttr | + + +- 准备SQL请求 + +| API | 是否支持 | 标准 | 作用 | +|------------------|----------|------|------------------------------------------------------------------------------------------------| +| SQLAllocStmt | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocStmt 已替换为 SQLAllocHandle | +| SQLPrepare | 支持 | ISO 92 | 用于预处理SQL语句,这通常是SQLExecute之前的一个步骤 | +| SQLBindCol | 支持 | ODBC | 用于将结果集中的列绑定到应用程序缓冲区 | +| SQLBindParameter | 支持 | ODBC | 用于将SQL语句的参数绑定到应用程序缓冲区 | +| SQLGetCursorName | 不支持 | ISO 92 | 返回与指定语句关联的游标名称 | +| SQLSetCursorName | 不支持 | ISO 92 | 设置游标名称,允许在查询中使用命名游标 | +| SQLSetScrollOptions| 不支持 | ODBC | 设置控制光标行为的选项 | + + +- 提交请求 + +| API | 是否支持 | 标准 | 作用 | +|------------------|----------|------|------------------------------------------------------------------------------------------------| +| SQLExecute | 支持 | ISO 92 | 用于执行之前通过 SQLPrepare 准备好的SQL语句 | +| SQLExecDirect | 支持 | ISO 92 | 用于执行包含SQL语句的字符串 | +| SQLNativeSql | 不支持 | ODBC | 用于将应用程序提供的SQL语句转换为数据库驱动程序的本机SQL语法 | +| SQLDescribeParam | 支持 | ODBC | 返回语句中特定参数的描述 | +| SQLNumParams | 支持 | ISO 92 | 用于查询预编译SQL语句中的参数数量 | +| SQLParamData | 不支持 | ISO 92 | 用于从参数数据流中获取下一个参数值 | +| SQLPutData | 不支持 | ISO 92 | 当使用流输入方式时,可以用于向输出参数发送数据块 | + + +- 检索结果和关于结果的信息 + +| API | 是否支持 | 标准 | 作用 | +|------------------|----------|------|------------------------------------------------------------------------------------------------| +| SQLRowCount | 支持 | ISO 92 | 返回受插入或删除请求影响的行数 | +| SQLNumResultCols | 支持 | ISO 92 | 返回结果集中的列数 | +| SQLDescribeCol | 支持 | ISO 92 | 用于描述结果集中列的属性。它提供了关于列的数据类型、列名、列的最大宽度、小数位数和是否可为空等信息 | +| SQLColAttribute | 支持 | ISO 92 | 返回结果集中列的描述符信息,如标题、排序规则等 | +| SQLColAttributes | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLColAttributes 已替换为 SQLColAttribute | +| SQLGetData | 支持 | ODBC | 用于从结果集中的当前行获取特定列的数据 | +| SQLMoreResults | 支持 | ODBC | 多个结果集的 SQL 语句执行后(例如:一个批处理或存储过程),移动到下一个结果集 | +| SQLFetch | 支持 | ISO 92 | 用于从结果集中提取下一行数据,并返回所有绑定列的数据 | +| SQLFetchScroll | 支持 | ISO 92 | 用于从结果集中提取指定的数据行集,并返回所有绑定列的数据 | +| SQLExtendedFetch | 不支持 | 弃用 | 在 ODBC 3.x 中,SQLExtendedFetch 已替换为 SQLFetchScroll | +| SQLSetPos | 支持 | ODBC | 设置行集中的游标位置,并允许应用程序更新数据集中的行 | +| SQLBulkOperations| 不支持 | ODBC | 执行批量插入和批量书签操作,包括更新、删除和按书签提取 | + + +- 检索错误或诊断信息 + +| API | 是否支持 | 标准 | 作用 | +|------------------|----------|------|------------------------------------------------------------------------------------------------| +| SQLError | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.x 函数 SQLError 已替换为 SQLGetDiagRec | +| SQLGetDiagField | 支持 | ISO 92 | 返回附加诊断信息(单条诊断结果) | +| SQLGetDiagRec | 支持 | ISO 92 | 返回附加诊断信息(多条诊断结果) | + + +- 获取有关数据源的系统表项的信息 + +| API | 是否支持 | 标准 | 作用 | +|--------------------|----------|-------|---------------------------------------------------------------------------------------------| +| SQLColumnPrivileges| 不支持 | ODBC | 用于检索指定表中列的权限信息,如哪些用户或角色拥有对特定列的读取、插入、更新或删除权限 | +| SQLColumns | 支持 | X/Open | 返回指定表中的列名列表 | +| SQLForeignKeys | 不支持 | ODBC | 检索外键关系的详细信息 | +| SQLPrimaryKeys | 支持 | ODBC | 返回构成表主键的列名列表 | +| SQLSpecialColumns | 不支持 | X/Open | 返回数据库中特殊列的信息,如唯一键或索引列 | +| SQLStatistics | 不支持 | ISO 92 | 返回关于表的统计信息,如行数、列数、平均行宽等 | +| SQLTablePrivileges | 不支持 | ODBC | 返回用户在特定表上的权限,如SELECT、INSERT、UPDATE等 | +| SQLTables | 支持 | X/Open | 返回存储在数据源的当前数据库中的表信息 | +| SQLProcedures | 不支持 | ODBC | 返回数据库中可用的存储过程信息,包括名称和类型 | +| SQLProcedureColumns | 不支持 | ODBC | 返回存储过程的列信息,包括输入输出参数的详细信息 | + + +- 执行事务 + +| API | 是否支持 | 标准 | 作用 | +|--------------------|----------|-------|---------------------------------------------------------------------------------------------| +| SQLTransact | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.x 函数 SQLTransact 已替换为 SQLEndTran | +| SQLEndTran | 支持 | ISO 92 | 用于提交或回滚事务,TDengine 不支持事务,因此不支持回滚操作 | + + +- 终止连接 + +| API | 是否支持 | 标准 | 作用 | +|--------------------|----------|-------|---------------------------------------------------------------------------------------------| +| SQLDisconnect | 支持 | ISO 92 | 断开数据库连接 | +| SQLFreeHandle | 支持 | ISO 92 | 释放与特定环境、连接、语句或描述符句柄关联的资源 | +| SQLFreeConnect | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLFreeConnect 已替换为 SQLFreeHandle | +| SQLFreeEnv | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLFreeEnv 已替换为 SQLFreeHandle | +| SQLFreeStmt | 支持 | ODBC | 结束语句处理,丢弃挂起的结果,并且可以选择释放与语句句柄关联的所有资源 | +| SQLCloseCursor | 支持 | ODBC | 关闭与当前语句句柄关联的游标,并释放游标所使用的所有资源 | + + +## 数据类型映射 + +下表说明了 ODBC 连接器如何将服务器数据类型映射到默认的 SQL 和 C 数据类型。 + +| Native Value | SQL Type | C Type | +|--------------------|-------------------|-------------------| +| TIMESTAMP | SQL_TYPE_TIMESTAMP| SQL_C_TIMESTAMP | +| INT | SQL_INTEGER | SQL_C_SLONG | +| INT UNSIGNED | SQL_INTEGER | SQL_C_ULONG | +| BIGINT | SQL_BIGINT | SQL_C_SBIGINT | +| BIGINT UNSIGNED | SQL_BIGINT | SQL_C_UBIGINT | +| FLOAT | SQL_REAL | SQL_C_FLOAT | +| DOUBLE | SQL_REAL | SQL_C_DOUBLE | +| BINARY | SQL_BINARY | SQL_C_BINARY | +| SMALLINT | SQL_SMALLINT | SQL_C_SSHORT | +| SMALLINT UNSIGNED | SQL_SMALLINT | SQL_C_USHORT | +| TINYINT | SQL_TINYINT | SQL_C_STINYINT | +| TINYINT UNSIGNED | SQL_TINYINT | SQL_C_UTINYINT | +| BOOL | SQL_BIT | SQL_C_BIT | +| NCHAR | SQL_VARCHAR | SQL_C_CHAR | +| JSON | SQL_VARCHAR | SQL_C_CHAR | +| VARCHAR | SQL_VARCHAR | SQL_C_CHAR | +| GEOMETRY | SQL_VARBINARY | SQL_C_BINARY | +| VARBINARY | SQL_VARBINARY | SQL_C_BINARY | + + ## 与第三方集成 作为使用 TDengine ODBC driver 的一个示例,你可以使用 Power BI 与 TDengine 分析时序数据。更多细节请参考 [Power BI](../../../third-party/bi/powerbi) diff --git a/docs/zh/14-reference/05-connector/assets/odbc-native-config-zh.webp b/docs/zh/14-reference/05-connector/assets/odbc-native-config-zh.webp index 5589bc6cf76ae728ac00c88c8147a203801b0483..ee8c48b4ef38f73cf81fbf4c8ba8d2077ef03e62 100644 GIT binary patch literal 10930 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 literal 15080 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 diff --git a/docs/zh/14-reference/05-connector/assets/odbc-ws-config-zh.webp b/docs/zh/14-reference/05-connector/assets/odbc-ws-config-zh.webp index 6a9cece9d90f93d4efecb436e666a3bc59fa558e..70c0fc8b8d985f79f6b253aa1e0e529b4d985539 100644 GIT binary patch literal 11292 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 VZ$#w(k8`^B+O<}9SNB$u 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 BAQS)q From c088f426f9b5033d622639afb9c26a5529f9b76d Mon Sep 17 00:00:00 2001 From: Yaming Pei Date: Fri, 27 Sep 2024 20:42:39 +0800 Subject: [PATCH 2/7] docs: convert the ODBC API description from a table to an unordered list --- docs/zh/14-reference/05-connector/50-odbc.mdx | 459 ++++++++++++++---- 1 file changed, 355 insertions(+), 104 deletions(-) diff --git a/docs/zh/14-reference/05-connector/50-odbc.mdx b/docs/zh/14-reference/05-connector/50-odbc.mdx index af3f79b0c6..ac317435df 100644 --- a/docs/zh/14-reference/05-connector/50-odbc.mdx +++ b/docs/zh/14-reference/05-connector/50-odbc.mdx @@ -104,141 +104,392 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:Websocket 连接与 本节按功能分类汇总了 ODBC API。 -- 数据源和驱动程序管理 +### 数据源和驱动程序管理 -| API | 是否支持 | 标准 | 作用 | -|------------------|----------|------|------------------------------------------------------------------------------------------------| -| ConfigDSN | 支持 | ODBC | 配置数据源 | -| ConfigDriver | 支持 | ODBC | 用于执行与特定驱动程序相关的安装和配置任务 | -| ConfigTranslator | 支持 | ODBC | 用于解析DSN的配置,在DSN配置和实际数据库驱动程序配置之间进行翻译或转换 | +- API: ConfigDSN + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 配置数据源 + +- API: ConfigDriver + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 用于执行与特定驱动程序相关的安装和配置任务 + +- API: ConfigTranslator + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 用于解析DSN的配置,在DSN配置和实际数据库驱动程序配置之间进行翻译或转换 -- 连接到数据源 +### 连接到数据源 -| API | 是否支持 | 标准 | 作用 | -|------------------|----------|------|------------------------------------------------------------------------------------------------| -| SQLAllocHandle | 支持 | ISO 92 | 分配环境、连接、语句或描述符句柄 | -| SQLConnect | 支持 | ISO 92 | 通过数据源名称、用户 ID 和密码连接到特定驱动程序 | -| SQLDriverConnect| 支持 | ODBC | 通过连接字符串连接到特定驱动程序,支持更多连接信息 | -| SQLBrowseConnect | 不支持 | ODBC | 用于发现和枚举连接到数据源所需的特性和属性值。每次调用 SQLBrowseConnect 都会返回属性和属性值的连续级别 | -| SQLAllocEnv | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocEnv 已替换为 SQLAllocHandle | -| SQLAllocConnect | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocConnect 已替换为 SQLAllocHandle | +- API: SQLAllocHandle + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 分配环境、连接、语句或描述符句柄 + +- API: SQLConnect + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 通过数据源名称、用户 ID 和密码连接到特定驱动程序 + +- API: SQLDriverConnect + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 通过连接字符串连接到特定驱动程序,支持更多连接信息 + +- API: SQLBrowseConnect + - **是否支持**: 不支持 + - **标准**: ODBC + - **作用**: 用于发现和枚举连接到数据源所需的特性和属性值。每次调用 SQLBrowseConnect 都会返回属性和属性值的连续级别 + +- API: SQLAllocEnv + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocEnv 已替换为 SQLAllocHandle + +- API: SQLAllocConnect + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocConnect 已替换为 SQLAllocHandle -- 获取有关驱动程序和数据源的信息 +### 获取有关驱动程序和数据源的信息 -| API | 是否支持 | 标准 | 作用 | -|------------------|----------|------|------------------------------------------------------------------------------------------------| -| SQLDataSources | 不支持 | ISO 92 | 返回可用数据源的列表,由驱动程序管理器处理 | -| SQLDrivers | 不支持 | ISO 92 | 返回由驱动程序管理器处理的已安装驱动程序及其属性的列表 | -| SQLGetInfo | 支持 | ISO 92 | 返回有关数据库环境的详细信息,如数据库产品名称、驱动程序名、数据库的SQL语法特性、连接能力等等 | -| SQLGetFunctions | 不支持 | ISO 92 | 用于查询驱动程序支持的函数 | -| SQLGetTypeInfo | 支持 | ISO 92 | 返回有关支持的数据类型的信息 | +- API: SQLDataSources + - **是否支持**: 不支持 + - **标准**: ISO 92 + - **作用**: 返回可用数据源的列表,由驱动程序管理器处理 + +- API: SQLDrivers + - **是否支持**: 不支持 + - **标准**: ISO 92 + - **作用**: 返回由驱动程序管理器处理的已安装驱动程序及其属性的列表 + +- API: SQLGetInfo + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 返回有关数据库环境的详细信息,如数据库产品名称、驱动程序名、数据库的SQL语法特性、连接能力等等 + +- API: SQLGetFunctions + - **是否支持**: 不支持 + - **标准**: ISO 92 + - **作用**: 用于查询驱动程序支持的函数 + +- API: SQLGetTypeInfo + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 返回有关支持的数据类型的信息 -- 设置和检索驱动程序属性 +### 设置和检索驱动程序属性 -| API | 是否支持 | 标准 | 作用 | -|------------------|----------|------|------------------------------------------------------------------------------------------------| -| SQLSetConnectAttr| 支持 | ISO 92 | 设置连接属性,当设置SQL_ATTR_AUTOCOMMIT属性时,用于控制自动提交模式 | -| SQLGetConnectAttr| 支持 | ISO 92 | 返回连接属性的值 | -| SQLSetConnectOption| 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetConnectOption 已替换为 SQLSetConnectAttr | -| SQLGetConnectOption| 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetConnectOption 已替换为 SQLGetConnectAttr | -| SQLSetEnvAttr | 支持 | ISO 92 | 设置控制环境的属性 | -| SQLGetEnvAttr | 支持 | ISO 92 | 返回环境属性的当前设置 | -| SQLSetStmtAttr | 支持 | ISO 92 | 设置与语句相关的属性 | -| SQLGetStmtAttr | 支持 | ISO 92 | 返回语句属性的当前设置 | -| SQLSetStmtOption | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetStmtOption 已替换为 SQLSetStmtAttr | -| SQLGetStmtOption | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetStmtOption 已替换为 SQLGetStmtAttr | +- API: SQLSetConnectAttr + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 设置连接属性,当设置SQL_ATTR_AUTOCOMMIT属性时,用于控制自动提交模式 + +- API: SQLGetConnectAttr + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 返回连接属性的值 + +- API: SQLSetConnectOption + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetConnectOption 已替换为 SQLSetConnectAttr + +- API: SQLGetConnectOption + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetConnectOption 已替换为 SQLGetConnectAttr + +- API: SQLSetEnvAttr + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 设置控制环境的属性 + +- API: SQLGetEnvAttr + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 返回环境属性的当前设置 + +- API: SQLSetStmtAttr + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 设置与语句相关的属性 + +- API: SQLGetStmtAttr + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 返回语句属性的当前设置 + +- API: SQLSetStmtOption + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetStmtOption 已替换为 SQLSetStmtAttr + +- API: SQLGetStmtOption + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetStmtOption 已替换为 SQLGetStmtAttr -- 准备SQL请求 +### 准备SQL请求 -| API | 是否支持 | 标准 | 作用 | -|------------------|----------|------|------------------------------------------------------------------------------------------------| -| SQLAllocStmt | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocStmt 已替换为 SQLAllocHandle | -| SQLPrepare | 支持 | ISO 92 | 用于预处理SQL语句,这通常是SQLExecute之前的一个步骤 | -| SQLBindCol | 支持 | ODBC | 用于将结果集中的列绑定到应用程序缓冲区 | -| SQLBindParameter | 支持 | ODBC | 用于将SQL语句的参数绑定到应用程序缓冲区 | -| SQLGetCursorName | 不支持 | ISO 92 | 返回与指定语句关联的游标名称 | -| SQLSetCursorName | 不支持 | ISO 92 | 设置游标名称,允许在查询中使用命名游标 | -| SQLSetScrollOptions| 不支持 | ODBC | 设置控制光标行为的选项 | +- API: SQLAllocStmt + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocStmt 已替换为 SQLAllocHandle + +- API: SQLPrepare + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 用于预处理SQL语句,这通常是SQLExecute之前的一个步骤 + +- API: SQLBindCol + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 用于将结果集中的列绑定到应用程序缓冲区 + +- API: SQLBindParameter + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 用于将SQL语句的参数绑定到应用程序缓冲区 + +- API: SQLGetCursorName + - **是否支持**: 不支持 + - **标准**: ISO 92 + - **作用**: 返回与指定语句关联的游标名称 + +- API: SQLSetCursorName + - **是否支持**: 不支持 + - **标准**: ISO 92 + - **作用**: 设置游标名称,允许在查询中使用命名游标 + +- API: SQLSetScrollOptions + - **是否支持**: 不支持 + - **标准**: ODBC + - **作用**: 设置控制光标行为的选项 -- 提交请求 +### 提交请求 -| API | 是否支持 | 标准 | 作用 | -|------------------|----------|------|------------------------------------------------------------------------------------------------| -| SQLExecute | 支持 | ISO 92 | 用于执行之前通过 SQLPrepare 准备好的SQL语句 | -| SQLExecDirect | 支持 | ISO 92 | 用于执行包含SQL语句的字符串 | -| SQLNativeSql | 不支持 | ODBC | 用于将应用程序提供的SQL语句转换为数据库驱动程序的本机SQL语法 | -| SQLDescribeParam | 支持 | ODBC | 返回语句中特定参数的描述 | -| SQLNumParams | 支持 | ISO 92 | 用于查询预编译SQL语句中的参数数量 | -| SQLParamData | 不支持 | ISO 92 | 用于从参数数据流中获取下一个参数值 | -| SQLPutData | 不支持 | ISO 92 | 当使用流输入方式时,可以用于向输出参数发送数据块 | +- API: SQLExecute + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 用于执行之前通过 SQLPrepare 准备好的SQL语句 + +- API: SQLExecDirect + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 用于执行包含SQL语句的字符串 + +- API: SQLNativeSql + - **是否支持**: 不支持 + - **标准**: ODBC + - **作用**: 用于将应用程序提供的SQL语句转换为数据库驱动程序的本机SQL语法 + +- API: SQLDescribeParam + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 返回语句中特定参数的描述 + +- API: SQLNumParams + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 用于查询预编译SQL语句中的参数数量 + +- API: SQLParamData + - **是否支持**: 不支持 + - **标准**: ISO 92 + - **作用**: 用于从参数数据流中获取下一个参数值 + +- API: SQLPutData + - **是否支持**: 不支持 + - **标准**: ISO 92 + - **作用**: 当使用流输入方式时,可以用于向输出参数发送数据块 -- 检索结果和关于结果的信息 +### 检索结果和关于结果的信息 -| API | 是否支持 | 标准 | 作用 | -|------------------|----------|------|------------------------------------------------------------------------------------------------| -| SQLRowCount | 支持 | ISO 92 | 返回受插入或删除请求影响的行数 | -| SQLNumResultCols | 支持 | ISO 92 | 返回结果集中的列数 | -| SQLDescribeCol | 支持 | ISO 92 | 用于描述结果集中列的属性。它提供了关于列的数据类型、列名、列的最大宽度、小数位数和是否可为空等信息 | -| SQLColAttribute | 支持 | ISO 92 | 返回结果集中列的描述符信息,如标题、排序规则等 | -| SQLColAttributes | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLColAttributes 已替换为 SQLColAttribute | -| SQLGetData | 支持 | ODBC | 用于从结果集中的当前行获取特定列的数据 | -| SQLMoreResults | 支持 | ODBC | 多个结果集的 SQL 语句执行后(例如:一个批处理或存储过程),移动到下一个结果集 | -| SQLFetch | 支持 | ISO 92 | 用于从结果集中提取下一行数据,并返回所有绑定列的数据 | -| SQLFetchScroll | 支持 | ISO 92 | 用于从结果集中提取指定的数据行集,并返回所有绑定列的数据 | -| SQLExtendedFetch | 不支持 | 弃用 | 在 ODBC 3.x 中,SQLExtendedFetch 已替换为 SQLFetchScroll | -| SQLSetPos | 支持 | ODBC | 设置行集中的游标位置,并允许应用程序更新数据集中的行 | -| SQLBulkOperations| 不支持 | ODBC | 执行批量插入和批量书签操作,包括更新、删除和按书签提取 | +- API: SQLRowCount + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 返回受插入或删除请求影响的行数 + +- API: SQLNumResultCols + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 返回结果集中的列数 + +- API: SQLDescribeCol + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 用于描述结果集中列的属性。它提供了关于列的数据类型、列名、列的最大宽度、小数位数和是否可为空等信息 + +- API: SQLColAttribute + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 返回结果集中列的描述符信息,如标题、排序规则等 + +- API: SQLColAttributes + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLColAttributes 已替换为 SQLColAttribute + +- API: SQLGetData + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 用于从结果集中的当前行获取特定列的数据 + +- API: SQLMoreResults + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 多个结果集的 SQL 语句执行后(例如:一个批处理或存储过程),移动到下一个结果集 + +- API: SQLFetch + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 用于从结果集中提取下一行数据,并返回所有绑定列的数据 + +- API: SQLFetchScroll + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 用于从结果集中提取指定的数据行集,并返回所有绑定列的数据 + +- API: SQLExtendedFetch + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,SQLExtendedFetch 已替换为 SQLFetchScroll + +- API: SQLSetPos + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 设置行集中的游标位置,并允许应用程序更新数据集中的行 + +- API: SQLBulkOperations + - **是否支持**: 不支持 + - **标准**: ODBC + - **作用**: 执行批量插入和批量书签操作,包括更新、删除和按书签提取 -- 检索错误或诊断信息 +### 检索错误或诊断信息 -| API | 是否支持 | 标准 | 作用 | -|------------------|----------|------|------------------------------------------------------------------------------------------------| -| SQLError | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.x 函数 SQLError 已替换为 SQLGetDiagRec | -| SQLGetDiagField | 支持 | ISO 92 | 返回附加诊断信息(单条诊断结果) | -| SQLGetDiagRec | 支持 | ISO 92 | 返回附加诊断信息(多条诊断结果) | +- API: SQLError + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,ODBC 2.x 函数 SQLError 已替换为 SQLGetDiagRec + +- API: SQLGetDiagField + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 返回附加诊断信息(单条诊断结果) + +- API: SQLGetDiagRec + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 返回附加诊断信息(多条诊断结果) -- 获取有关数据源的系统表项的信息 +### 获取有关数据源的系统表项的信息 -| API | 是否支持 | 标准 | 作用 | -|--------------------|----------|-------|---------------------------------------------------------------------------------------------| -| SQLColumnPrivileges| 不支持 | ODBC | 用于检索指定表中列的权限信息,如哪些用户或角色拥有对特定列的读取、插入、更新或删除权限 | -| SQLColumns | 支持 | X/Open | 返回指定表中的列名列表 | -| SQLForeignKeys | 不支持 | ODBC | 检索外键关系的详细信息 | -| SQLPrimaryKeys | 支持 | ODBC | 返回构成表主键的列名列表 | -| SQLSpecialColumns | 不支持 | X/Open | 返回数据库中特殊列的信息,如唯一键或索引列 | -| SQLStatistics | 不支持 | ISO 92 | 返回关于表的统计信息,如行数、列数、平均行宽等 | -| SQLTablePrivileges | 不支持 | ODBC | 返回用户在特定表上的权限,如SELECT、INSERT、UPDATE等 | -| SQLTables | 支持 | X/Open | 返回存储在数据源的当前数据库中的表信息 | -| SQLProcedures | 不支持 | ODBC | 返回数据库中可用的存储过程信息,包括名称和类型 | -| SQLProcedureColumns | 不支持 | ODBC | 返回存储过程的列信息,包括输入输出参数的详细信息 | +- API: SQLColumnPrivileges + - **是否支持**: 不支持 + - **标准**: ODBC + - **作用**: 用于检索指定表中列的权限信息,如哪些用户或角色拥有对特定列的读取、插入、更新或删除权限 + +- API: SQLColumns + - **是否支持**: 支持 + - **标准**: X/Open + - **作用**: 返回指定表中的列名列表 + +- API: SQLForeignKeys + - **是否支持**: 不支持 + - **标准**: ODBC + - **作用**: 检索外键关系的详细信息 + +- API: SQLPrimaryKeys + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 返回构成表主键的列名列表 + +- API: SQLSpecialColumns + - **是否支持**: 不支持 + - **标准**: X/Open + - **作用**: 返回数据库中特殊列的信息,如唯一键或索引列 + +- API: SQLStatistics + - **是否支持**: 不支持 + - **标准**: ISO 92 + - **作用**: 返回关于表的统计信息,如行数、列数、平均行宽等 + +- API: SQLTablePrivileges + - **是否支持**: 不支持 + - **标准**: ODBC + - **作用**: 返回用户在特定表上的权限,如SELECT、INSERT、UPDATE等 + +- API: SQLTables + - **是否支持**: 支持 + - **标准**: X/Open + - **作用**: 返回存储在数据源的当前数据库中的表信息 + +- API: SQLProcedures + - **是否支持**: 不支持 + - **标准**: ODBC + - **作用**: 返回数据库中可用的存储过程信息,包括名称和类型 + +- API: SQLProcedureColumns + - **是否支持**: 不支持 + - **标准**: ODBC + - **作用**: 返回存储过程的列信息,包括输入输出参数的详细信息 -- 执行事务 +### 执行事务 -| API | 是否支持 | 标准 | 作用 | -|--------------------|----------|-------|---------------------------------------------------------------------------------------------| -| SQLTransact | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.x 函数 SQLTransact 已替换为 SQLEndTran | -| SQLEndTran | 支持 | ISO 92 | 用于提交或回滚事务,TDengine 不支持事务,因此不支持回滚操作 | +- API: SQLTransact + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,ODBC 2.x 函数 SQLTransact 已替换为 SQLEndTran + +- API: SQLEndTran + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 用于提交或回滚事务,TDengine 不支持事务,因此不支持回滚操作 -- 终止连接 +### 终止连接 -| API | 是否支持 | 标准 | 作用 | -|--------------------|----------|-------|---------------------------------------------------------------------------------------------| -| SQLDisconnect | 支持 | ISO 92 | 断开数据库连接 | -| SQLFreeHandle | 支持 | ISO 92 | 释放与特定环境、连接、语句或描述符句柄关联的资源 | -| SQLFreeConnect | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLFreeConnect 已替换为 SQLFreeHandle | -| SQLFreeEnv | 不支持 | 弃用 | 在 ODBC 3.x 中,ODBC 2.0 函数 SQLFreeEnv 已替换为 SQLFreeHandle | -| SQLFreeStmt | 支持 | ODBC | 结束语句处理,丢弃挂起的结果,并且可以选择释放与语句句柄关联的所有资源 | -| SQLCloseCursor | 支持 | ODBC | 关闭与当前语句句柄关联的游标,并释放游标所使用的所有资源 | +- API: SQLDisconnect + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 断开数据库连接 + +- API: SQLFreeHandle + - **是否支持**: 支持 + - **标准**: ISO 92 + - **作用**: 释放与特定环境、连接、语句或描述符句柄关联的资源 + +- API: SQLFreeConnect + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLFreeConnect 已替换为 SQLFreeHandle + +- API: SQLFreeEnv + - **是否支持**: 不支持 + - **标准**: 弃用 + - **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLFreeEnv 已替换为 SQLFreeHandle + +- API: SQLFreeStmt + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 结束语句处理,丢弃挂起的结果,并且可以选择释放与语句句柄关联的所有资源 + +- API: SQLCloseCursor + - **是否支持**: 支持 + - **标准**: ODBC + - **作用**: 关闭与当前语句句柄关联的游标,并释放游标所使用的所有资源 ## 数据类型映射 From 3c5c99006fcce368ec95cfe676f904f057fa7899 Mon Sep 17 00:00:00 2001 From: Yaming Pei Date: Fri, 27 Sep 2024 21:22:38 +0800 Subject: [PATCH 3/7] docs: adjust layout --- docs/zh/14-reference/05-connector/50-odbc.mdx | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/docs/zh/14-reference/05-connector/50-odbc.mdx b/docs/zh/14-reference/05-connector/50-odbc.mdx index ac317435df..31ac9eb55b 100644 --- a/docs/zh/14-reference/05-connector/50-odbc.mdx +++ b/docs/zh/14-reference/05-connector/50-odbc.mdx @@ -100,6 +100,33 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:Websocket 连接与 7. 也可以在第2步选择已经配置好的数据源名通过【配置】按钮进入配置页面,修改已有配置 + +## 数据类型映射 + +下表说明了 ODBC 连接器如何将服务器数据类型映射到默认的 SQL 和 C 数据类型。 + +| TDengine Type | SQL Type | C Type | +|--------------------|-------------------|-------------------| +| TIMESTAMP | SQL_TYPE_TIMESTAMP| SQL_C_TIMESTAMP | +| INT | SQL_INTEGER | SQL_C_SLONG | +| INT UNSIGNED | SQL_INTEGER | SQL_C_ULONG | +| BIGINT | SQL_BIGINT | SQL_C_SBIGINT | +| BIGINT UNSIGNED | SQL_BIGINT | SQL_C_UBIGINT | +| FLOAT | SQL_REAL | SQL_C_FLOAT | +| DOUBLE | SQL_REAL | SQL_C_DOUBLE | +| BINARY | SQL_BINARY | SQL_C_BINARY | +| SMALLINT | SQL_SMALLINT | SQL_C_SSHORT | +| SMALLINT UNSIGNED | SQL_SMALLINT | SQL_C_USHORT | +| TINYINT | SQL_TINYINT | SQL_C_STINYINT | +| TINYINT UNSIGNED | SQL_TINYINT | SQL_C_UTINYINT | +| BOOL | SQL_BIT | SQL_C_BIT | +| NCHAR | SQL_VARCHAR | SQL_C_CHAR | +| JSON | SQL_VARCHAR | SQL_C_CHAR | +| VARCHAR | SQL_VARCHAR | SQL_C_CHAR | +| GEOMETRY | SQL_VARBINARY | SQL_C_BINARY | +| VARBINARY | SQL_VARBINARY | SQL_C_BINARY | + + ## ODBC API 参考 本节按功能分类汇总了 ODBC API。 @@ -492,32 +519,6 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:Websocket 连接与 - **作用**: 关闭与当前语句句柄关联的游标,并释放游标所使用的所有资源 -## 数据类型映射 - -下表说明了 ODBC 连接器如何将服务器数据类型映射到默认的 SQL 和 C 数据类型。 - -| Native Value | SQL Type | C Type | -|--------------------|-------------------|-------------------| -| TIMESTAMP | SQL_TYPE_TIMESTAMP| SQL_C_TIMESTAMP | -| INT | SQL_INTEGER | SQL_C_SLONG | -| INT UNSIGNED | SQL_INTEGER | SQL_C_ULONG | -| BIGINT | SQL_BIGINT | SQL_C_SBIGINT | -| BIGINT UNSIGNED | SQL_BIGINT | SQL_C_UBIGINT | -| FLOAT | SQL_REAL | SQL_C_FLOAT | -| DOUBLE | SQL_REAL | SQL_C_DOUBLE | -| BINARY | SQL_BINARY | SQL_C_BINARY | -| SMALLINT | SQL_SMALLINT | SQL_C_SSHORT | -| SMALLINT UNSIGNED | SQL_SMALLINT | SQL_C_USHORT | -| TINYINT | SQL_TINYINT | SQL_C_STINYINT | -| TINYINT UNSIGNED | SQL_TINYINT | SQL_C_UTINYINT | -| BOOL | SQL_BIT | SQL_C_BIT | -| NCHAR | SQL_VARCHAR | SQL_C_CHAR | -| JSON | SQL_VARCHAR | SQL_C_CHAR | -| VARCHAR | SQL_VARCHAR | SQL_C_CHAR | -| GEOMETRY | SQL_VARBINARY | SQL_C_BINARY | -| VARBINARY | SQL_VARBINARY | SQL_C_BINARY | - - ## 与第三方集成 作为使用 TDengine ODBC driver 的一个示例,你可以使用 Power BI 与 TDengine 分析时序数据。更多细节请参考 [Power BI](../../../third-party/bi/powerbi) From 0654d0d153d1a42899a4ccabdec020859d82c432 Mon Sep 17 00:00:00 2001 From: Yaming Pei Date: Sat, 28 Sep 2024 12:22:01 +0800 Subject: [PATCH 4/7] docs: api reference rename --- docs/zh/14-reference/05-connector/50-odbc.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/14-reference/05-connector/50-odbc.mdx b/docs/zh/14-reference/05-connector/50-odbc.mdx index 31ac9eb55b..aba46a5d98 100644 --- a/docs/zh/14-reference/05-connector/50-odbc.mdx +++ b/docs/zh/14-reference/05-connector/50-odbc.mdx @@ -127,7 +127,7 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:Websocket 连接与 | VARBINARY | SQL_VARBINARY | SQL_C_BINARY | -## ODBC API 参考 +## API 参考 本节按功能分类汇总了 ODBC API。 From a396bda12a34416457f4047ef4b592324dc73059 Mon Sep 17 00:00:00 2001 From: Yaming Pei Date: Sat, 28 Sep 2024 16:32:23 +0800 Subject: [PATCH 5/7] docs: add chapters on supported platforms and historical versions --- docs/zh/14-reference/05-connector/50-odbc.mdx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/zh/14-reference/05-connector/50-odbc.mdx b/docs/zh/14-reference/05-connector/50-odbc.mdx index aba46a5d98..942b206510 100644 --- a/docs/zh/14-reference/05-connector/50-odbc.mdx +++ b/docs/zh/14-reference/05-connector/50-odbc.mdx @@ -101,6 +101,21 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:Websocket 连接与 7. 也可以在第2步选择已经配置好的数据源名通过【配置】按钮进入配置页面,修改已有配置 +## 支持的平台 + +原生连接方式支持的平台和 TDengine Windows X64版 客户端驱动支持的平台一致。 +WebSocket 连接方式除此之外还支持 Windows X64系统上运行的 32 位应用程序上使用。 + + +## 版本历史 + +| taos_odbc版本 | 主要变化 | TDengine 版本 | +| :----------- | :-------------------------------------------------------------------------------------------------- | :---------------- | +| v1.0.0.0 | 发布初始版本,支持与Tdengine数据库交互以读写数据,具体请参考"API 参考"一节 | 3.2.2.0及更高版本 | +| v1.0.1 | 1. 支持DSN设置BI模式,在BI模式下Tdengine数据库不返回系统数据库和超级表子表信息;
2. 重构字符集转换模块,提升读写性能;
3. Tdengine ODBC数据源配置对话框中默认修改默认连接方式为"WebSocket";
4. Tdengine ODBC数据源配置对话框增加"测试连接"控件;
5. Tdengine ODBC数据源配置支持中文/英文界面; | - | +| v1.0.2 | 支持CP1252字符编码; | 3.2.3.0及更高版本 | + + ## 数据类型映射 下表说明了 ODBC 连接器如何将服务器数据类型映射到默认的 SQL 和 C 数据类型。 @@ -129,7 +144,7 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:Websocket 连接与 ## API 参考 -本节按功能分类汇总了 ODBC API。 +本节按功能分类汇总了 ODBC API,关于完整的 ODBC API 参考,请访问 http://msdn.microsoft.com/en-us/library/ms714177.aspx 的ODBC程序员参考页面。 ### 数据源和驱动程序管理 From 0b8026a3d9129c9dc03c156fec93757b63bed3d2 Mon Sep 17 00:00:00 2001 From: Yaming Pei Date: Sun, 29 Sep 2024 18:48:19 +0800 Subject: [PATCH 6/7] docs: adjust the row order of the Version History table --- docs/zh/14-reference/05-connector/50-odbc.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh/14-reference/05-connector/50-odbc.mdx b/docs/zh/14-reference/05-connector/50-odbc.mdx index 942b206510..57f6ef8f22 100644 --- a/docs/zh/14-reference/05-connector/50-odbc.mdx +++ b/docs/zh/14-reference/05-connector/50-odbc.mdx @@ -111,9 +111,9 @@ WebSocket 连接方式除此之外还支持 Windows X64系统上运行的 32 位 | taos_odbc版本 | 主要变化 | TDengine 版本 | | :----------- | :-------------------------------------------------------------------------------------------------- | :---------------- | -| v1.0.0.0 | 发布初始版本,支持与Tdengine数据库交互以读写数据,具体请参考"API 参考"一节 | 3.2.2.0及更高版本 | -| v1.0.1 | 1. 支持DSN设置BI模式,在BI模式下Tdengine数据库不返回系统数据库和超级表子表信息;
2. 重构字符集转换模块,提升读写性能;
3. Tdengine ODBC数据源配置对话框中默认修改默认连接方式为"WebSocket";
4. Tdengine ODBC数据源配置对话框增加"测试连接"控件;
5. Tdengine ODBC数据源配置支持中文/英文界面; | - | | v1.0.2 | 支持CP1252字符编码; | 3.2.3.0及更高版本 | +| v1.0.1 | 1. 支持DSN设置BI模式,在BI模式下Tdengine数据库不返回系统数据库和超级表子表信息;
2. 重构字符集转换模块,提升读写性能;
3. Tdengine ODBC数据源配置对话框中默认修改默认连接方式为"WebSocket";
4. Tdengine ODBC数据源配置对话框增加"测试连接"控件;
5. Tdengine ODBC数据源配置支持中文/英文界面; | - | +| v1.0.0.0 | 发布初始版本,支持与Tdengine数据库交互以读写数据,具体请参考"API 参考"一节 | 3.2.2.0及更高版本 | ## 数据类型映射 From 2b72fb410049bc5374686573fd4f47b824177e51 Mon Sep 17 00:00:00 2001 From: Yaming Pei Date: Sun, 29 Sep 2024 20:37:23 +0800 Subject: [PATCH 7/7] docs: add version 1.1.0 info --- docs/zh/14-reference/05-connector/50-odbc.mdx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/zh/14-reference/05-connector/50-odbc.mdx b/docs/zh/14-reference/05-connector/50-odbc.mdx index 57f6ef8f22..38dd88b86d 100644 --- a/docs/zh/14-reference/05-connector/50-odbc.mdx +++ b/docs/zh/14-reference/05-connector/50-odbc.mdx @@ -111,9 +111,10 @@ WebSocket 连接方式除此之外还支持 Windows X64系统上运行的 32 位 | taos_odbc版本 | 主要变化 | TDengine 版本 | | :----------- | :-------------------------------------------------------------------------------------------------- | :---------------- | -| v1.0.2 | 支持CP1252字符编码; | 3.2.3.0及更高版本 | -| v1.0.1 | 1. 支持DSN设置BI模式,在BI模式下Tdengine数据库不返回系统数据库和超级表子表信息;
2. 重构字符集转换模块,提升读写性能;
3. Tdengine ODBC数据源配置对话框中默认修改默认连接方式为"WebSocket";
4. Tdengine ODBC数据源配置对话框增加"测试连接"控件;
5. Tdengine ODBC数据源配置支持中文/英文界面; | - | -| v1.0.0.0 | 发布初始版本,支持与Tdengine数据库交互以读写数据,具体请参考"API 参考"一节 | 3.2.2.0及更高版本 | +| v1.1.0 | 1. 支持视图功能;
2. 支持 VARBINARY/GEOMETRY 数据类型; | 3.3.3.0及更高版本 | +| v1.0.2 | 支持 CP1252 字符编码; | 3.2.3.0及更高版本 | +| v1.0.1 | 1. 支持 DSN 设置 BI 模式,在 BI 模式下 TDengine 数据库不返回系统数据库和超级表子表信息;
2. 重构字符集转换模块,提升读写性能;
3. ODBC 数据源配置对话框中默认修改默认连接方式为“WebSocket”;
4. ODBC 数据源配置对话框增加“测试连接”控件;
5. ODBC 数据源配置支持中文/英文界面; | - | +| v1.0.0.0 | 发布初始版本,支持与Tdengine数据库交互以读写数据,具体请参考“API 参考”一节 | 3.2.2.0及更高版本 | ## 数据类型映射