连接转换

ODBC 连接具有以下状态。

状态 说明
C0 未分配的环境、未分配的连接
C1 分配的环境,未分配的连接
C2 分配的环境,已分配的连接
C3 连接函数需要数据
C4 连接连接
C5 连接的连接,已分配的语句
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] 此行显示 HandleType SQL_HANDLE_ENV时的转换。

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

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

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

[5] 使用 OutputHandlePtr 调用 SQLAllocHandle,该句柄指向有效句柄会覆盖该句柄,而不考虑以前处理的内容,并可能导致 ODBC 驱动程序出现问题。 ODBC 应用程序编程不正确,使用为 *OutputHandlePtr 定义的同一应用程序变量调用 SQLAllocHandle 两次,而无需调用 SQLFreeHandle 释放句柄,然后再重新分配它。 以这种方式覆盖 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] or ([5], [6], [8]) C4[5] 和 [7] C5[5], [6], 和 [9]
(IH)[2] (IH) (08003) (08003) -- -- C5

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

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

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

[4] 连接上的提交或回滚失败。 在本例中,该函数返回SQL_ERROR。

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

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

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

[8] 连接至少有一条语句存在打开的游标,并且数据源在提交或回滚事务时保留游标,无论适用者(具体取决于 CompletionTypeSQL_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] 此行显示 HandleType SQL_HANDLE_ENV时的转换。

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

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

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

[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] 属性参数已SQL_ATTR_ACCESS_MODE、SQL_ATTR_AUTOCOMMIT、SQL_ATTR_LOGIN_TIMEOUT、SQL_ATTR_ODBC_CURSORS、SQL_ATTR_TRACE或SQL_ATTR_TRACEFILE,或者已为连接属性设置值。

[2] 属性 参数未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] 此行显示 HandleType SQL_HANDLE_ENV时的转换。

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

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

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

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] InfoType 参数未SQL_ODBC_VER。

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] 属性参数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] Attribute 参数未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) -- --