ODBC驱动程序

义项:开放数据库互连驱动程序
ODBC驱动程序

ODBC驱动程序(ODBC Driver)是开放数据库互连(ODBC)体系中直接与具体数据库管理系统通信的组件,通常以动态链接库形式提供,负责把标准的 ODBC 函数调用转换成目标数据库能够理解的请求并返回结果。它位于应用程序与数据源之间,使同一段应用代码可以访问不同厂商的数据库。[1]

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

ODBC驱动程序是开放数据库互连规范中承担数据库侧实现的软件组件,一般以动态链接库的形式存在,向上对驱动程序管理器提供标准的 ODBC 函数,向下与某一特定数据库管理系统交换数据。在完整的 ODBC 结构中,它和应用程序、驱动程序管理器、数据源并列,是四个组成部分之一。[2]

驱动程序的作用类似系统里的打印机驱动:应用只按统一约定发出指令,由驱动完成与具体设备的适配。[3]ODBC 规范本身只规定接口,不规定实现,因此每个数据库产品都需要有自己的 ODBC 驱动程序,Oracle、DB2、SQL Server、Access 等都有对应驱动。[4]

原理

应用程序并不直接调用驱动程序,而是先与驱动程序管理器绑定,由管理器根据数据源名称查到对应驱动的文件名,将其载入内存并把各个函数的地址记录成表,再按连接句柄把调用转发给目标驱动。[5]管理器自身也实现 SQLDataSources、SQLDrivers、SQLGetFunctions 等少数函数,并负责句柄非空、调用顺序和参数合法性等基本检查。[5]

驱动被调用后要完成建链、接收请求、在需要时转换数据格式、返回结果,并把错误整理成标准错误码交回应用程序;游标管理和显式事务的启动也在驱动内部处理,对应用不可见。ODBC 的 API 在与应用和管理器之间、管理器与驱动之间使用的是同一套接口,这一层也称服务提供者接口(SPI)。[6]


flowchart LR

A[应用程序] -->|ODBC API| B[驱动程序管理器]

B -->|SPI 转发| C[ODBC 驱动程序]

C --> D[(数据源)]

B -.-> E[数据源注册信息 DSN]

E -.-> C

连接所需的信息既可以事先在管理器中登记为用户、系统或文件 DSN,也可以直接写在连接字符串里,用 DRIVER={驱动名称} 等字段指明要加载的驱动。[4]在非 Windows 平台上,驱动一般需要配合 unixODBC 或 iODBC 这类驱动管理器使用,配置文件常为 odbc.ini 与 odbcinst.ini。[7]

发展历程

20 世纪 80 年代后期,Oracle、Sybase、Informix、Ingres、HP、DEC 等厂商组成 SQL Access Group,提出以调用级接口(CLI)作为 SQL 访问规范的核心。[2]微软在此基础上与 Simba Technologies 合作,于 1992 年 9 月推出 ODBC 1.0 及相应驱动,以统一的方式屏蔽各数据库的差异。[1][3]

1994 年发布的第 2 版重新组织了 API 核心,调整了一级、二级一致性的要求并引入新的数据类型;1995 年的 ODBC 3.0 增加了更多 API 和描述符句柄。[3]同期,X/Open 与 ISO 以 ODBC 3.0 为基础完成标准化,SQL/CLI 于 1995 年成为国际 SQL 标准的第 3 部分。[1]此后规范长期保持稳定,多数 Linux 驱动和应用仍以 ODBC 3.0 为准。[3]

开源侧,unixODBC 项目于 1999 年由 Peter Harvey 建立,同年 7 月由 Easysoft 的 Nick Gorham 重写驱动管理器并接手领导,其代码以 GPL/LGPL 授权,覆盖 ODBC 3.0 的 API 规范。[8]与之并行的 iODBC 项目则追求平台无关的实现,由 OpenLink Software 维护。[4]

应用

只要应用通过 ODBC 接口编写,更换数据库时往往只需替换驱动和数据源配置,而不必改动业务代码,这种可移植性使 ODBC 成为客户机/服务器架构中被广泛采用的数据访问方式。[9]微软的 Visual Basic、Visual C++、Excel、Word、FoxPro、Access 等产品都曾内置对 ODBC 的支持。[2]

各类数据库和分析产品都随附或单独提供 ODBC 驱动,例如云数据库 GaussDB 提供 Linux 与 Windows 版本的驱动包,OceanBase 在下载中心提供 OB-ODBC 驱动,SAP SQL Anywhere 则说明其对 ODBC 3.5 各一致性级别的支持情况。[10][11][12]在异种数据库互操作场景中,ODBC 被视为事实上的通用接口,常被用于数据迁移和跨库查询。[13]

局限

ODBC 的层次较多,调用需要经过驱动管理器中转,性能通常低于数据库厂商专有的本地接口,这是标准化与开放性带来的代价。[2]有研究指出 ODBC 难以跟上数据类型在范围和规模上的增长,访问大型数据库或非关系型数据库时已成为较重的处理过程,而数据库厂商的关注重点多在 DBMS 本身而非 ODBC 的响应速度。[14]

规范把驱动功能划分为核心、一级、二级三个接口一致性级别,驱动只需满足某一级别的要求,因此应用与驱动之间可能出现能力不匹配:驱动支持的级别偏低,而应用所需的函数并不存在。[2]应用只能通过 SQLGetInfo、SQLGetFunctions 等调用在运行时探测驱动的实际能力,再决定采用哪种降级方案。

此外,驱动由不同厂商各自开发,测试标准难以统一,开发与测试工具也不够完善;在非 SQL 数据源上的应用同样存在限制。[2]即便是商业数据库的驱动,也可能对自研数据类型存在兼容问题,例如 tinyint、smalldatetime 等类型在获取元数据时可能报错。[9]

参见

  • 开放数据库互连 —— 定义 ODBC 接口与体系结构的标准,ODBC 驱动程序是其数据库侧实现。

  • 驱动程序管理器 —— 负责加载驱动并转发 ODBC 调用的中间层组件。

  • unixODBC —— 在类 Unix 平台上提供 ODBC API 及驱动管理器的开源项目。

  • JDBC —— Java 语言中与 ODBC 定位相近的数据库访问接口标准。

  • 数据源名称 —— 应用连接数据库时用于指明驱动与连接参数的标识。

参考资料

  1. 维基百科,自由的百科全书 [引用日期2026-10-29]
  2. ODBC技术 [引用日期2026-10-29]
  3. The Life and Times of ODBC [引用日期2026-10-29]
  4. 開放式資料庫連接 [引用日期2026-10-29]
  5. title: "The Driver Manager | Microsoft Docs" [引用日期2026-10-29]
  6. title: "ODBC Architecture | Microsoft Docs" [引用日期2026-10-29]
  7. ODBC概述 | GBASE南大通用 [引用日期2026-10-29]
  8. UnixODBC [引用日期2026-10-29]
  9. 基于ODBC开发_数据仓库服务 DWS-华为云 [引用日期2026-10-29]
  10. ctyun.cn 上的网页 [引用日期2026-10-29]
  11. 下载 ODBC 驱动-OB Cloud 云数据库文档-分布式数据库使用文档 [引用日期2026-10-29]
  12. 您可以使用任意ODBC应用程序的ODBC转义语法 [引用日期2026-10-29]
  13. ODBC驱动程序 [引用日期2026-10-29]
  14. references [引用日期2026-10-29]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:23:27Z

历史版本

本条目引用的词条
开放数据库互连 SQL Access Group 驱动程序管理器 unixODBC JDBC 数据源名称