行为更改和 ODBC 3.x 驱动程序

环境属性SQL_ATTR_ODBC_VERSION向驱动程序指示它是否需要表现出 ODBC 2.x 行为或 ODBC 3.x 行为。 SQL_ATTR_ODBC_VERSION环境属性的设置方式取决于应用程序。 ODBC 3.x 应用程序在调用 SQLAllocHandle 以分配环境句柄之后,在调用 SQLAllocHandle 以分配连接句柄之前,必须调用 SQLSetEnvAttr 来设置此属性。 如果无法执行此操作,驱动程序管理器在后一次调用 SQLAllocHandle 时) 返回 SQLSTATE HY010 (函数序列错误。

注意

有关行为更改和应用程序行为方式的详细信息,请参阅 行为更改

使用 ODBC 3.x 头文件重新编译的 ODBC 2.x 应用程序和 ODBC 2.x 应用程序不调用 SQLSetEnvAttr 但是,它们调用 SQLAllocEnv 而不是 SQLAllocHandle 来分配环境句柄。 因此,当应用程序在驱动程序管理器中调用 SQLAllocEnv 时,驱动程序管理器在驱动程序中调用 SQLAllocHandleSQLSetEnvAttr 。 因此,ODBC 3.x 驱动程序始终可以计数设置的此属性。

如果使用 ODBC_STD 编译标志编译的符合标准的应用程序调用 SQLAllocEnv (这可能因 ISO) 中未弃用 SQLAllocEnv 而发生,则调用将在编译时映射到 SQLAllocHandleStd 。 在运行时,应用程序调用 SQLAllocHandleStd。 驱动程序管理器将SQL_ATTR_ODBC_VERSION环境属性设置为SQL_OV_ODBC3。 调用 SQLAllocHandleStd 等效于对 SQLAllocHandle 的调用,其中 HandleType 为 SQL_HANDLE_ENV,调用 SQLSetEnvAttr 将 SQL_ATTR_ODBC_VERSION 设置为 SQL_OV_ODBC3。

在某些驱动程序体系结构中,驱动程序需要显示为 ODBC 2.x 驱动程序或 ODBC 3.x 驱动程序,具体取决于连接。 在这种情况下,驱动程序实际上可能不是驱动程序,而是驻留在驱动程序管理器和另一个驱动程序之间的层。 例如,它可能会模拟驱动程序,如 ODBC Spy。 在另一个示例中,它可能充当网关,如 EDA/SQL。 若要显示为 ODBC 3.x 驱动程序,此类驱动程序必须能够导出 SQLAllocHandle,并且要显示为 ODBC 2.x 驱动程序,必须能够导出 SQLAllocConnectSQLAllocEnvSQLAllocStmt。 分配环境、连接或语句时,驱动程序管理器会检查此驱动程序是否导出 SQLAllocHandle。 由于驱动程序会这样做,驱动程序管理器在驱动程序中调用 SQLAllocHandle 。 如果驱动程序使用 ODBC 2.x 驱动程序,则驱动程序必须根据需要将对 SQLAllocHandle 的调用映射到 SQLAllocConnectSQLAllocEnvSQLAllocStmt。 作为 ODBC 2.x 驱动程序运行时,它还必须不对 SQLSetEnvAttr 调用执行任何操作。

本部分包含以下主题。