状态转换

ODBC 为每个环境、每个连接和每个语句定义离散“状态”。 例如,环境有三种可能的状态:未分配(未分配任何环境)、已分配(已分配环境但未分配连接)和连接(已分配环境和一个或多个连接)。 连接有七种可能的状态;语句有 13 种可能的状态。

当应用程序调用特定函数或多个函数并将句柄传递给该项时,由其句柄标识的特定项从一个状态移动到另一个状态。 这种移动称为“状态转换”。 例如,使用 SQLAllocHandle 分配环境句柄会将环境从“未分配”移动到“已分配”,使用 SQLFreeHandle 释放该句柄会将环境从“已分配”返回到“未分配”。 ODBC 定义了有限数量的合法状态转换,这是函数必须按特定顺序调用的另一种方法。

某些函数(如 SQLGetConnectAttr)根本不影响状态。 其他函数影响单个项的状态。 例如,SQLDisconnect 将连接从“连接”状态移动到“已分配”状态。 最后,某些函数会影响多个项的状态。 例如,使用 SQLAllocHandle 分配连接句柄会将连接从“未分配”移动到“已分配”状态,并将环境从“已分配”移动到“连接”状态。

如果应用程序不按顺序调用函数,该函数将返回“状态转换错误”。 例如,如果环境处于“连接”状态,并且应用程序调用具有该环境句柄的 SQLFreeHandle,SQLFreeHandle 将返回 SQLSTATE HY010(函数顺序错误),因为该函数只能在环境处于“已分配”状态时调用。 通过将此项定义为无效状态转换,ODBC 可防止应用程序在存在活动连接时释放环境。

ODBC 设计中固有某些状态转换。 例如,不先分配环境句柄就不可能分配连接句柄,因为分配连接句柄的函数需要环境句柄。 驱动程序管理器和驱动程序强制执行其他状态转换。 例如,SQLExecute 执行已准备的语句。 如果传递给该函数的语句句柄未处于“已准备”状态,SQLExecute 将返回 SQLSTATE HY010(函数顺序错误)。

从应用程序的角度来看,状态转换通常很简单:合法状态转换往往与编写良好的应用程序流一起进行。 驱动程序管理器和驱动程序的状态转换更为复杂,因为必须跟踪环境、每个连接和每个语句的状态。 大部分工作由驱动程序管理器完成;驱动程序必须完成的大多数工作都与具有挂起结果的语句一起执行。

本手册第 1 部分和第 2 部分(“ODBC 简介”和“开发应用程序和驱动程序”)往往不明确提及状态转换。 相反,这两部分描述了调用函数必须遵循的顺序。 例如,“执行语句”指出,必须先使用 SQLPrepare 准备语句,然后才能使用 SQLExecute 执行该语句。 有关状态和状态转换的完整说明,包括驱动程序管理器检查哪些转换,以及驱动程序必须检查哪些转换,请参阅附录 B:ODBC 状态转换表