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