连接转换

ODBC 连接具有以下状态。

状态 说明
C0 未分配的环境、未分配的连接
C1 分配的环境,未分配的连接
C2 分配的环境、已分配的连接
C3 连接函数需要数据
C4 已连接连接
C5 Connected connection, allocated 语句
C6 已连接连接,事务正在进行中。 连接可能处于状态 C6,且未在连接上分配任何语句。 例如,假设连接处于手动提交模式,并且处于 C4 状态。 如果已分配语句, (启动事务) 执行,然后释放该语句,则该事务将保持活动状态,但连接上没有语句。

下表显示了每个 ODBC 函数如何影响连接状态。

SQLAllocHandle

C0

没有 Env。
C1 未分配 C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
C1[1] --[5] --[5] --[5] --[5] --[5] --[5]
(IH) [2] C2 --[5] --[5] --[5] --[5] --[5]
(IH) [3] (IH) (08003) (08003) C5 --[5] --[5]
(IH) [4] (IH) (08003) (08003) --[5] --[5] --[5]

[1] 此行显示SQL_HANDLE_ENV HandleType 时的转换。

[2] 此行显示SQL_HANDLE_DBC HandleType 时的转换。

[3] 此行显示 SQL_HANDLE_STMT HandleType 时的转换。

[4] 此行显示SQL_HANDLE_DESC HandleType 时的转换。

[5] 使用指向有效句柄的 OutputHandlePtr 调用 SQLAllocHandle 会覆盖该句柄,而不考虑该句柄的先前内容,并可能导致 ODBC 驱动程序出现问题。 使用为 OutputHandlePtr 定义的同一应用程序变量调用 SQLAllocHandle 两次,而不调用 SQLFreeHandle 以在重新分配句柄之前释放句柄,这是不正确的 ODBC 应用程序编程。 以这种方式覆盖 ODBC 句柄可能会导致 ODBC 驱动程序的行为不一致或错误。

SQLBrowseConnect

C0

没有 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) (IH) C3 [d] C4 [s] -- [d] C2 [e] C4 [s] (08002) (08002) (08002)

SQLCloseCursor

C0

没有 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) (IH) (IH) (IH) (IH) -- --[1] C5[2]

[1] 连接处于手动提交模式。

[2] 连接处于自动提交模式。

SQLColumnPrivileges、SQLColumns、SQLForeignKeys、SQLGetTypeInfo、SQLPrimaryKeys、SQLProcedureColumns、SQLProcedures、SQLSpecialColumns、SQLStatistics、SQLTablePrivileges 和 SQLTables

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) (IH) (IH) (IH) (IH) --[1] C6[2] --

[1] 连接处于自动提交模式,或者数据源未开始事务。

[2] 连接处于手动提交模式,数据源开始事务。

SQLConnect

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) (IH) C4 (08002) (08002) (08002) (08002)

SQLCopyDesc、SQLGetDescField、SQLGetDescRec、SQLSetDescField 和 SQLSetDescRec

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) (IH) (IH) (IH) --[1] -- --

[1] 在此状态下,应用程序唯一可用的描述符是显式分配的描述符。

SQLDataSources 和 SQLDrivers

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) -- -- -- -- -- --

SQLDisconnect

C0

没有 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) (IH) (08003) C2 C2 C2 25000

SQLDriverConnect

C0

没有 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) (IH) C4 s -- n[f] (08002) (08002) (08002) (08002)

SQLEndTran

C0

没有 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) [1] --[3] --[3] --[3] -- -- --[4] 或 ([5]、[6]和 [8]) C4[5] 和 [7] C5[5]、[6] 和 [9]
(IH) [2] (IH) (08003) (08003) -- -- C5

[1] 此行显示SQL_HANDLE_ENV HandleType 时的转换。

[2] 此行显示SQL_HANDLE_DBC HandleType 时的转换。

[3] 由于连接未处于连接状态,因此它不受事务影响。

[4] 连接上的提交或回滚失败。 在这种情况下,函数返回SQL_ERROR。

[5] 连接上的提交或回滚成功。 如果提交或回滚在另一个连接上失败,则函数返回SQL_ERROR;如果提交或回滚在所有连接上都成功,则函数返回SQL_SUCCESS。

[6] 在连接上分配了至少一个语句。

[7] 没有在连接上分配语句。

[8] 连接至少有一个语句,其中有一个打开的游标,并且数据源在提交或回滚事务时保留游标,根据 CompletionType 是SQL_COMMIT还是SQL_ROLLBACK) 应用 (。 有关详细信息,请参阅 SQLGetInfo 中的SQL_CURSOR_COMMIT_BEHAVIOR和SQL_CURSOR_ROLLBACK_BEHAVIOR属性。

[9] 如果连接有任何语句存在打开的游标,则提交或回滚事务时不会保留游标。

SQLExecDirect 和 SQLExecute

C0

没有 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) (IH) (IH) (IH) (IH) --[1] C6[2] C6[3] --

[1] 连接处于自动提交模式,并且执行的语句不是 游标规范 (例如 SELECT 语句) ;或连接处于手动提交模式,并且执行的语句未开始事务。

[2] 连接处于自动提交模式,执行的语句是 游标规范 (如 SELECT 语句) 。

[3] 连接处于手动提交模式,数据源开始事务。

SQLFreeHandle

C0

没有 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) [1] C0 (HY010) (HY010) (HY010) (HY010) (HY010)
(IH) [2] (IH) (C1) (HY010) (HY010) (HY010) (HY010)
(IH) [3] (IH) (IH) (IH) (IH) C4[5] --[6] --[7] C4[5] 和 [8] C5[6] 和 [8]
(IH) [4] (IH) (IH) (IH) -- -- --

[1] 此行显示SQL_HANDLE_ENV HandleType 时的转换。

[2] 此行显示SQL_HANDLE_DBC HandleType 时的转换。

[3] 此行显示 SQL_HANDLE_STMT HandleType 时的转换。

[4] 此行显示SQL_HANDLE_DESC HandleType 时的转换。

[5] 连接上只分配了一个语句。

[6] 在连接上分配了多个语句。

[7] 连接处于手动提交模式。

[8] 连接处于自动提交模式。

SQLFreeStmt

C0

没有 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) [1] (IH) (IH) (IH) (IH) -- C5[3] --[4]
(IH) [2] (IH) (IH) (IH) (IH) -- --

[1] 当 Option 参数SQL_CLOSE时,此行显示事务。

[2] 当 Option 参数SQL_UNBIND或SQL_RESET_PARAMS时,此行显示事务。

[3] 连接处于自动提交模式,除此语句外,任何语句上均未打开游标。

[4] 连接处于手动提交模式,或者处于自动提交模式,并且至少在另外一个语句上打开了一个游标。

SQLGetConnectAttr

C0

没有 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
IH IH --[1] 08003[2] HY010 -- -- --

[1] Attribute 参数SQL_ATTR_ACCESS_MODE、SQL_ATTR_AUTOCOMMIT、SQL_ATTR_LOGIN_TIMEOUT、SQL_ATTR_ODBC_CURSORS、SQL_ATTR_TRACE或SQL_ATTR_TRACEFILE,或者已为连接属性设置了值。

[2] Attribute 参数未SQL_ATTR_ACCESS_MODE、SQL_ATTR_AUTOCOMMIT、SQL_ATTR_LOGIN_TIMEOUT、SQL_ATTR_ODBC_CURSORS、SQL_ATTR_TRACE或SQL_ATTR_TRACEFILE,并且尚未为连接属性设置值。

SQLGetDiagField 和 SQLGetDiagRec

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) [1] -- -- -- -- -- --
(IH) [2] (IH) -- -- -- -- --
(IH) [3] (IH) (IH) (IH) (IH) -- --
(IH) [4] (IH) (IH) (IH) -- -- --

[1] 此行显示SQL_HANDLE_ENV HandleType 时的转换。

[2] 此行显示SQL_HANDLE_DBC HandleType 时的转换。

[3] 此行显示SQL_HANDLE_STMT HandleType 时的转换。

[4] 此行显示SQL_HANDLE_DESC HandleType 时的转换。

SQLGetEnvAttr

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
IH -- -- -- -- -- --

SQLGetFunctions

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
IH IH HY010 HY010 -- -- --

SQLGetInfo

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
IH IH --[1] 08003[2] 08003 -- -- --

[1] InfoType 参数已SQL_ODBC_VER。

[2] 未SQL_ODBC_VER InfoType 参数。

SQLMoreResults

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) (IH) (IH) (IH) (IH) --[1] C6[2] --[3] C5[1]

[1] 连接处于自动提交模式,对 SQLMoreResults 的 调用尚未初始化游标规范的结果集的处理。

[2] 连接处于自动提交模式,对 SQLMoreResults 的 调用已初始化游标规范的结果集的处理。

[3] 连接处于手动提交模式。

SQLNativeSql

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) (IH) (08003) (08003) -- -- --

SQLPrepare

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) (IH) (IH) (IH) (IH) --[1] C6[2] --

[1] 连接处于自动提交模式,或者数据源未开始事务。

[2] 连接处于手动提交模式,数据源开始事务。

SQLSetConnectAttr

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
IH IH --[1] 08003[2] HY010 --[3] 08002[4] HY011[5] --[3] 08002[4] HY011[5] --[3] 和 [6] C5[8] 08002[4] HY011[5] 或 [7]

[1] Attribute 参数未SQL_ATTR_TRANSLATE_LIB或SQL_ATTR_TRANSLATE_OPTION。

[2] Attribute 参数SQL_ATTR_TRANSLATE_LIB或SQL_ATTR_TRANSLATE_OPTION。

[3] Attribute 参数未SQL_ATTR_ODBC_CURSORS或SQL_ATTR_PACKET_SIZE。

[4] 属性 参数已SQL_ATTR_ODBC_CURSORS。

[5] 属性 参数已SQL_ATTR_PACKET_SIZE。

[6] 未SQL_ATTR_AUTOCOMMIT Attribute 参数,或者 属性 参数已SQL_ATTR_AUTOCOMMIT并且设置此属性未提交事务。

[7] 属性 参数SQL_ATTR_TXN_ISOLATION。

[8] 属性 参数SQL_ATTR_AUTOCOMMIT,并设置此属性提交事务。

SQLSetEnvAttr

C0

无 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) -- -- (HY010) -- -- --

所有其他 ODBC 函数

C0

没有 Env。
C1

未分配
C2

已分配
C3

需要数据
C4

已连接
C5

语句
C6

事务
(IH) (IH) (IH) (IH) (IH) -- --