连接过程中的驱动程序管理器角色

请记住,应用程序无法直接调用驱动程序函数。 相反,它们会调用同名的驱动程序管理器函数,且驱动程序管理器会调用驱动程序函数。 通常,这种情况几乎会立即发生。 例如,应用程序在驱动程序管理器中调用 SQLExecute,在进行一些错误检查后,驱动程序管理器调用驱动程序中的 SQLExecute

连接进程不同。 当应用程序使用 SQL_HANDLE_ENV 和 SQL_HANDLE_DBC 选项调用 SQLAllocHandle 时,该函数仅在驱动程序管理器中分配句柄。 驱动程序管理器不会调用驱动程序中的此函数,因为它不知道要调用哪个驱动程序。 同样地,如果应用程序将未连接的连接句柄传递给 SQLSetConnectAttrSQLGetConnectAttr,则只有驱动程序管理器执行该函数。 它存储或获取其连接句柄中的属性值,并在获取尚未设置且 ODBC 未对其定义默认值时的属性值返回 SQLSTATE 08003(连接未打开)。

当应用程序调用 SQLConnectSQLDriverConnectSQLBrowseConnect 时,驱动程序管理器首先确定要使用的驱动程序。 然后,其会检查以确定驱动程序当前是否在连接上已加载:

  • 如果未在连接上加载驱动程序,驱动程序管理器将检查指定的驱动程序是否会加载到同一环境中的另一个连接上。 否则,驱动程序管理器会在连接上加载驱动程序,并使用 SQL_HANDLE_ENV 选项调用驱动程序中的 SQLAllocHandle

    然后,驱动程序管理器使用 SQL_HANDLE_DBC 选项调用驱动程序中的 SQLAllocHandle,无论它是否刚刚加载。 如果应用程序设置了任何连接属性,驱动程序管理器会调用驱动程序中的 SQLSetConnectAttr;如果发生错误,驱动程序管理器的连接函数将返回 SQLSTATE IM006(驱动程序的 SQLSetConnectAttr 失败)。 最后,驱动程序管理器在驱动程序中调用连接函数。

  • 如果在连接上加载了指定的驱动程序,驱动程序管理器只会调用驱动程序中的连接函数。 在这种情况下,驱动程序必须确保连接上的所有连接属性均保留了其当前设置。

  • 如果在连接上加载了其他驱动程序,驱动程序管理器会调用驱动程序中的 SQLFreeHandle 来释放连接。 如果没有使用驱动程序的其他连接,驱动程序管理器会调用驱动程序中的 SQLFreeHandle 来释放环境并卸载驱动程序。 然后,驱动程序管理器将执行与未在连接上加载驱动程序时相同的操作。

HandleType 设置为 SQL_HANDLE_DBC 时,驱动程序管理器会在调用驱动程序的 SQLAllocHandleSQLFreeHandle 之前锁定环境句柄 (henv)。

当应用程序调用 SQLDisconnect 时,驱动程序管理器会调用驱动程序中的 SQLDisconnect。 但是,当应用程序重新连接到驱动程序时,其会让驱动程序完成加载。 当应用程序使用 SQL_HANDLE_DBC 选项调用 SQLFreeHandle 时,驱动程序管理器会调用驱动程序中的 SQLFreeHandle。 如果驱动程序未被任何其他连接使用,驱动程序管理器将使用 SQL_HANDLE_ENV 选项调用驱动程序中的 SQLFreeHandle 并卸载驱动程序。