驱动程序管理器是一个库,用于管理应用程序和驱动程序之间的通信。 例如,在 Microsoft Windows 平台上,驱动程序管理器是Microsoft编写的动态链接库 (DLL),可由可再发行的 MDAC 2.8 SP1 SDK 的用户重新分发。
驱动程序管理器主要作为应用程序编写器的便利,解决了所有应用程序常见的许多问题。 这包括根据数据源名称确定要加载的驱动程序、加载和卸载驱动程序以及调用驱动程序中的函数。
若要查看后者为何是个问题,请考虑如果应用程序直接调用驱动程序中的函数,会发生什么情况。 除非应用程序直接链接到特定驱动程序,否则它必须生成指向该驱动程序中的函数的指针表,并按指针调用这些函数。 一次对多个驱动程序使用相同的代码会增加另一个复杂性级别。 应用程序首先必须设置一个函数指针,以指向正确驱动程序中的正确函数,然后通过该指针调用该函数。
驱动程序管理器通过提供一个调用每个函数的位置来解决此问题。 应用程序链接到驱动程序管理器,并在驱动程序管理器中调用 ODBC 函数,而不是驱动程序。 应用程序使用 连接句柄标识目标驱动程序和数据源。 加载驱动程序时,驱动程序管理器会生成指向该驱动程序中函数的指针表。 它使用应用程序传递的连接句柄在目标驱动程序中查找函数的地址,并通过地址调用该函数。
在大多数情况下,驱动程序管理器只是将函数调用从应用程序传递到正确的驱动程序。 但是,它还实现某些函数(SQLDataSources、 SQLDrivers 和 SQLGetFunctions),并执行基本错误检查。 例如,驱动程序管理器检查句柄是否不是 null 指针、按正确顺序调用的函数以及某些函数参数是否有效。 有关驱动程序管理器检查的错误的完整说明,请参阅每个函数和 附录 B 的参考部分:ODBC 状态转换表。
驱动程序管理器的最终主要角色是加载和卸载驱动程序。 应用程序仅加载和卸载驱动程序管理器。 当它想要使用特定驱动程序时,它会在驱动程序管理器中调用连接函数(SQLConnect、 SQLDriverConnect 或 SQLBrowseConnect),并指定特定数据源或驱动程序的名称,例如“会计”或“SQL Server”。使用此名称,驱动程序管理器将搜索数据源信息中驱动程序的文件名,例如 Sqlsrvr.dll。 然后,它会加载驱动程序(假设尚未加载)将每个函数的地址存储在驱动程序中,并在驱动程序中调用连接函数,然后初始化自身并连接到数据源。
使用驱动程序完成应用程序后,它会在驱动程序管理器中调用 SQLDisconnect 。 驱动程序管理器在驱动程序中调用此函数,该函数与数据源断开连接。 但是,如果应用程序重新连接到驱动程序,驱动程序管理器会将驱动程序保留在内存中。 仅当应用程序释放驱动程序使用的连接或将连接用于其他驱动程序时,它才会卸载驱动程序,并且没有其他连接使用该驱动程序。 有关驱动程序管理器在加载和卸载驱动程序中角色的完整说明,请参阅 驱动程序管理器在连接过程中的角色。