驱动程序管理器中的函数映射

驱动程序管理器支持采用字符串参数的函数的两个入口点。 未编码的函数 (SQLDriverConnect) 是 ANSI 形式的函数。 Unicode 形式用 W (SQLDriverConnectW) 修饰。

ODBC 头文件还支持使用 A (SQLDriverConnectA) 修饰的函数,以便于混合的 ANSI/Unicode 应用程序。 对 A 函数进行的调用实际上是对未修饰入口点 (SQLDriverConnect) 的调用。

如果使用 _UNICODE #define 编译应用程序,ODBC 头文件会将未修饰的函数调用 (SQLDriverConnect) 映射到 Unicode 版本 (SQLDriverConnectW)。

如果驱动程序支持 SQLConnectW,则驱动程序管理器会将驱动程序识别为 Unicode 驱动程序。

如果驱动程序是 Unicode 驱动程序,驱动程序管理器会按如下所述进行函数调用:

  • 将不带字符串参数或参数的函数直接传递到驱动程序。

  • 将 Unicode 函数(带有 W 后缀)直接传递到驱动程序。

  • 通过将字符串参数转换为 Unicode 字符并将 Unicode 函数传递给驱动程序,将 ANSI 函数(带有 A 后缀)转换为 Unicode 函数(带有 W 后缀)。

如果驱动程序是 ANSI 驱动程序,则驱动程序管理器会按如下所述进行函数调用:

  • 将不带字符串参数或参数的函数直接传递到驱动程序。

  • 将 Unicode 函数(带有 W 后缀)转换为 ANSI 函数调用,并将其传递给驱动程序。

  • 将 ANSI 函数直接传递给驱动程序。

驱动程序管理器在内部启用了 Unicode。 因此,使用 Unicode 驱动程序的 Unicode 应用程序获得了最佳性能,因为驱动程序管理器只是将 Unicode 函数传递到驱动程序。 当 ANSI 应用程序使用 ANSI 驱动程序时,驱动程序管理器必须在处理某些函数(如 SQLDriverConnect)时将字符串从 ANSI 转换为 Unicode。 处理函数后,驱动程序管理器必须先将 Unicode 字符串转换回 ANSI,然后再将函数发送到 ANSI 驱动程序。

当驱动程序返回 SQL_STILL_EXECUTING 或 SQL_NEED_DATA 时,应用程序不应修改或读取其绑定参数缓冲区。 驱动程序管理器将缓冲区保留绑定到 ANSI,直到驱动程序返回 SQL_SUCCESS、SQL_SUCCESS_WITH_INFO 或 SQL_ERROR。 多线程应用程序不应访问另一个线程正在对其执行 SQL 语句的任何绑定参数值。 驱动程序管理器将数据从 Unicode “就地”转换为 ANSI,而其他线程可能会在驱动程序仍在处理 SQL 语句时看到这些缓冲区中的 ANSI 数据。 将 Unicode 数据绑定到 ANSI 驱动程序的应用程序不得将两个不同的列绑定到同一地址。