将 3.5 驱动程序升级到 3.8 驱动程序

本主题提供将 ODBC 3.5 驱动程序升级到 ODBC 3.8 驱动程序的指导原则和注意事项。

版本号

以下指导原则与版本号相关:

  • 对于 SQL_ATTR_ODBC_VERSION,驱动程序应支持 SQL_OV_ODBC3_80,对于除 SQL_OV_ODBC2、SQL_OV_ODBC3 和 SQL_OV_ODBC3_80 以外的值返回 SQL_ERROR。 如果驱动程序从 SQLSetEnvAttr 函数返回 SQL_SUCCESS,驱动程序的未来版本将假定驱动程序支持 ODBC 一致性级别。

  • 当 SQL_DRIVER_ODBC_VER 传递给 InfoType 时,版本 3.8 驱动程序应从 SQLGetInfo 返回 03.80。 但是,旧版驱动程序管理器(包含在旧版 Microsoft Windows 中)会将驱动程序视为版本 3.5 驱动程序,并发出警告。

    在 Windows 7 中,驱动程序管理器版本为 03.80。 在 Windows 8 中,驱动程序管理器版本通过 SQLGetInfo SQL_DM_VER(InfoType 参数)时为 03.81。 在 Windows 7 和 Windows 8 中,SQL_ODBC_VER 将版本报告为 03.80。

特定于驱动程序的 C 数据类型

驱动程序在使用版本 3.8 ODBC 应用程序时,可以自定义 C 数据类型。 (有关详细信息,请参阅 ODBC 中的 C 数据类型)。但是,3.8 驱动程序不需要实现任何特定于驱动程序的 C 类型。 但驱动程序仍应执行 C 类型的范围检查;驱动程序管理器不会对 3.8 驱动程序执行此操作。 为了促进驱动程序开发,可以采用以下格式定义特定于驱动程序的 C 数据类型的值:

SQL_DRIVER_C_TYPE_BASE+0, SQL_DRIVER_C_TYPE_BASE+1  
特定于驱动程序的数据类型、描述符类型、信息类型、诊断类型和属性

开发新驱动程序时,应将特定于驱动程序的范围用于数据类型、描述符类型、信息类型、诊断类型和属性。 特定于驱动程序的范围及其基类型值在特定于驱动程序的数据类型、描述符类型、信息类型、诊断类型和属性中进行了讨论。

连接池

为了更好地管理连接池,ODBC 3.8 引入了 SQLSetConnectAttr 中的 SQL_ATTR_RESET_CONNECTION 连接属性。 SQL_RESET_CONNECTION_YES 是此属性的唯一有效值。 将在驱动程序管理器将连接置于连接池之前设置 SQL_ATTR_RESET_CONNECTION,从而允许驱动程序将其他连接属性重置为其默认值。

为了避免与服务器进行不必要的通信,驱动程序可以在从池中重用连接后,将连接属性重置延迟,直至与远程服务器的下一次通信。

请注意,SQL_ATTR_RESET_CONNECTION 仅用于驱动程序管理器和驱动程序之间的通信。 应用程序无法直接设置此属性。 所有版本 3.8 驱动程序都应实现此连接属性。

流式处理输出参数

ODBC 版本 3.8 引入了流式输出参数,这是检索输出参数的更可缩放的方法。 (有关详细信息,请参阅使用 SQLGetData 检索输出参数。)若要支持此功能,当 SQL_GETDATA_EXTENSIONS 是 SQLGetInfo 调用中的 InfoType 时,驱动程序应在返回值中设置 SQL_GD_OUTPUT_PARAMS。 必须在驱动程序中实现对具有流式输出参数的 SQL 类型的支持。 驱动程序管理器不会为无效的 SQL 类型生成错误。 支持流式传输输出参数的 SQL 类型在驱动程序中进行了定义。

如果应用程序使用 SQLGetData 检索的参数与 SQLParamData 返回的参数不同,驱动程序应返回 SQL_ERROR。

连接操作的异步执行(轮询方法)

驱动程序可以启用对各种连接操作的异步支持。

从 Windows 7 开始,ODBC 支持轮询方法,有关详细信息,请参阅异步执行(轮询方法)。 版本 3.8 ODBC 驱动程序不需要在连接句柄上实现异步操作。 即使驱动程序未在连接句柄上实现异步操作,驱动程序仍应实现 SQL_ASYNC_DBC_FUNCTIONS InfoType 并返回 SQL_ASYNC_DBC_NOT_CAPABLE。

启用异步连接操作时,连接操作的运行时间是所有重复调用的总时间。 如果上次重复调用发生在总时间超过 SQL_ATTR_CONNECTION_TIMEOUT 连接属性设置的值之后,并且操作尚未完成,驱动程序将返回 SQL_ERROR 并记录诊断记录,包含 SQLState HYT01 和“连接超时已过期”的消息。 如果操作完成,则不会超时。

SQLCancelHandle 函数

ODBC 3.8 支持 SQLCancelHandle 函数,该函数用于取消连接和语句操作。 支持 SQLCancelHandle 的驱动程序必须导出函数。 如果应用程序对语句句柄调用 SQLCancel 或 SQLCancelHandle,则驱动程序不应取消正在进行的任何同步或异步连接函数。 同样,如果应用程序在连接句柄上调用 SQLCancelHandle,则驱动程序不应取消正在进行的任何同步或异步语句函数。 此外,如果应用程序在连接句柄上调用 SQLCancelHandle,则驱动程序不应取消浏览操作(SQLBrowseConnect 返回 SQL_NEED_DATA)。 在这些情况下,驱动程序应返回 HY010,“函数序列错误”。

不需要同时支持 SQLCancelHandle 和异步连接操作。 驱动程序可以支持异步连接操作,但不支持 SQLCancelHandle,反之亦然。

挂起的连接

ODBC 3.8 驱动程序管理器可以将连接置于挂起状态。 应用程序将调用 SQLDisconnect 以释放与连接关联的资源。 在这种情况下,驱动程序应尽量释放尽可能多的资源,而无需检查连接的状态。 有关挂起状态的详细信息,请参阅 SQLEndTran 函数

识别驱动程序的连接池

Windows 8 中的 ODBC 允许驱动程序自定义连接池行为。 有关详细信息,请参阅识别驱动程序的连接池

异步执行(通知方法)

ODBC 3.8 支持自 Windows 8 起可用的异步操作的通知方法。 有关详细信息,请参阅异步执行(通知方法)

另请参阅

开发 ODBC 驱动程序
Microsoft 提供的 ODBC 驱动程序
ODBC 3.8 中的新增功能