开放数据库互连

作者:Peter Harvey

开放数据库互连 (ODBC) 是一个开放规范,旨在为应用程序开发人员提供一个可预测的应用程序编程接口 (API),用于访问数据源。数据源几乎可以是任何东西,只要有人为其创建了 ODBC 驱动程序。最常见的数据源是 SQL 服务器。

使用 ODBC API 编写应用程序代码的两个主要优点是可移植的数据访问代码和动态数据绑定。

可移植的数据访问代码

ODBC API(或 CLI,命令行界面),如 X/Open 和 ISO 所概述的那样,可在所有主要平台上使用。 Microsoft 平台包含对此规范的许多增强功能。 Microsoft 的当前版本是 3.51。其理念是,使用 ODBC API 的程序员很可能拥有可移植到其他平台的数据访问代码。相同的代码也将在不同的数据源之间可移植。例如,会计程序应用程序的数据可以在开发期间驻留在轻量级 SQL 服务器上,然后只需链接到不同的 ODBC 驱动程序即可转移到重量级 SQL 服务器。 ODBC 实现了平台和数据源的可移植性。

动态绑定

动态绑定允许用户或系统管理员轻松配置应用程序以使用任何符合 ODBC 标准的数据源。这是使用 ODBC API 编写应用程序代码和购买此类应用程序的最大优势。动态绑定允许最终用户选择数据源(例如 SQL 服务器),并将其用于所有数据应用程序。应用程序无需为新的目标数据源重新编译或重新编码。这是通过 ODBC 驱动程序管理器实现的,它会将 ODBC 调用传递给用户的 ODBC 驱动程序,而无需重新链接代码。 ODBC 使最终用户可以选择数据存储位置。

unixODBC 项目

unixODBC 项目的目标是开发和推广 unixODBC,使其成为 Linux 平台上 ODBC 的权威标准。 这包括 Microsoft 扩展(在有意义的情况下)和 GUI 客户端。 unixODBC 团队正在通过为 Linux 平台上的 ODBC 需求提供最佳技术解决方案来实现这一目标。 所有 unixODBC 开发均在 GPL 或 LGPL 下发布。

该项目的组件包括驱动程序管理器、DataManager、ODBCConfig、Odbcinst、驱动程序和其他实用程序。

驱动程序管理器

图 1. 库

这个共享库是大多数 ODBC 活动的中心,但其功能很简单。 驱动程序管理器 90% 的功能是验证参数、加载和卸载驱动程序,并以符合 ODBC 规范的方式将调用传递给驱动程序。 通常,应用程序仅链接到此共享库以获得其所需的 ODBC 支持(参见图 1)。 驱动程序管理器加载/卸载相应的驱动程序并将调用传递给驱动程序。

DataManager

图 2. DataManager TreeView

这是一个 GUI 客户端实用程序。 当前版本基于 Troll Tech 的 Qt 类库 (http://www.troll.no/)。 DataManager 允许用户浏览和管理数据源(参见图 2)。 TreeView 的右侧包含一个相当大的画布,可以扩展以包含任何 TreeView 选择的属性。 数据源 TreeViewItem 已实现了一个示例。 选择数据源后,画布将成为一个方便的编辑器,可用于提交 SQL、查看结果以及保存/加载 SQL 或结果。 使用相同的技术可以轻松地将表设计器和数据编辑器添加到 DataManager。 DataManager 是管理 ODBC 数据源资源的简便方法。

ODBCConfig
Open Database Connectivity

图 3. ODBC 数据源管理器

这是另一个 GUI 客户端实用程序。 它的创建是为了与 Microsoft ODBC 管理实用程序用户兼容(参见图 3)。 ODBCConfig 使配置数据源变得容易,即使对于非技术人员也是如此。 ODBCConfig 使用 Odbcinst 库来读取/写入 ODBC 系统信息。 ODBCConfig 将利用任何已安装的驱动程序配置库来呈现可编辑的驱动程序特定选项列表。 ODBCConfig 功能是 KDE (http://www.kde.org/) 控制中心的绝佳候选者。 ODBCConfig 使配置 ODBC 数据源变得容易。

Odbcinst

图 4. ODBC 数据流

这是一个共享库,它实现了许多有用的 Microsoft 扩展和一些 unixODBC 扩展。 它提供了一个 API,用于读取和写入 ODBC 系统信息(参见图 4)。 这实际上意味着读取和写入各种 INI 文件和环境变量。 unixODBC 还为此库提供了一个命令行界面。 驱动程序程序员在创建其安装脚本/RPM 时可以使用此命令行工具(同名)。 Odbcinst 库被 ODBCConfig、驱动程序管理器和驱动程序大量使用,但很少被其他应用程序使用。 Odbcinst 实现了许多 Microsoft 扩展。

驱动程序

驱动程序及其特定于数据源的客户端库通常实现绝大多数 ODBC 功能。 驱动程序管理器固然重要,但执行大部分工作的是驱动程序。 unixODBC 驱动程序管理器旨在与 Linux 上编译的任何兼容驱动程序二进制兼容。 unixODBC 包含多个驱动程序(及其源代码)作为示例。 unixODBC 还包含一个驱动程序模板,供希望编写新驱动程序的人员使用。 MiniSQL、MySQL 和 PostgreSQL 是 unixODBC 中包含的驱动程序示例。 unixODBC 维护一个驱动程序认证流程,可以在其网站上找到(请参阅“资源”)。

其他实用程序

unixODBC 还包括一个用于处理 INI 文件的库、一个 LOG 库和一个用于执行 SQL 命令的命令行工具。 INI 库供 Odbcinst 用于读取/写入 ODBC 系统信息。 LOG 库供驱动程序管理器和 Odbcinst 用于记录 ODBC 活动(例如错误)并实现 ODBC 跟踪。 isql 命令行工具允许用户在终端窗口中提交 SQL 命令。 isql 也可以在批处理模式下使用,这非常有用,因为它可以用 HTML 表格或用选定的字符分隔的结果返回结果。 它支持管道和重定向。

如何开始?

您可以从 unixODBC 网站下载源发行版。 使用 tar 解压缩文件,然后按照 README 文件中的说明进行操作。 您将需要 Qt 开发库来构建 GUI 组件,并且您将需要特定于数据库的客户端库用于您决定构建的任何驱动程序。 README 文件对此进行了更详细的介绍。 您必须在 /etc/odbcinst.ini 中至少有一个驱动程序部分。 您可以使用 Odbcinst 命令行工具或您喜欢的编辑器添加此部分。 通常,odbcinst.ini 将由驱动程序安装脚本使用 Odbcinst 命令行工具更新,但此时,您可能必须直接编辑此文件。 odbcinst.ini 中的驱动程序部分应如下所示

[MiniSQL 2.x]
Description = MiniSQL ODBC Driver
Driver = /usr/lib/libodbcmini.so.1.0.0
Setup = /usr/lib/libodbcminiS.so.1.0.0
FileUsage = 2

现在运行 ODBCConfig 以添加、编辑或删除数据源。 您需要成为 root 用户才能使用系统数据源,但任何用户都可以添加、编辑和删除用户数据源。 现在运行 DataManager,您应该会看到所有 ODBC 数据源。 当您尝试展开数据源下方的 TreeView 时,系统将提示您输入登录信息以连接到数据源。 您也可以尝试使用 isql 命令行工具连接到您的数据源。 只需执行命令

$isql DataSourceName MyID MyPWD
应用程序的视角

大多数数据库访问可以使用少量的 ODBC 函数调用来完成。 事实上,保持简单是良好的实践,因为每个驱动程序都实现了自己的合规性和完整性级别。 应用程序可能会不时地与非常普通的驱动程序一起使用。 isql 命令行工具是仅使用一小部分简单 ODBC 函数的应用程序示例。 我不会深入探讨 ODBC API,因为您可以在其他地方找到优秀的参考资料。 典型的事件序列如下所示

  1. 连接到数据源。

  2. 创建并执行 SQL 语句。

  3. 处理结果。

  4. 关闭连接。

连接到数据源

通过调用 SQLAllocEnv 和 SQLAllocConnect 初始化 ODBC,然后调用 SQLConnect。

创建并执行 SQL 语句

通过调用 SQLAllocStmt 初始化语句。 调用 SQLPrepare 以允许驱动程序管理器有机会预处理 SQL,然后调用 SQLExecute。

处理结果

处理结果的最简单方法是在循环中调用 SQLFetch,并为结果集中的每一列调用 SQLGetData。 SQLNumResultCols 可用于找出结果集中有多少列。

关闭连接
Open Database Connectivity

图 5. 包含文件

调用 SQLFreeStmt、SQLDisconnect、SQLFreeConnect 和 SQLFreeEnv 进行清理。 您的源应包含 sqlext.h(参见图 5)并应链接 libodbc.so(参见图 1)。

驱动程序的视角

驱动程序和驱动程序管理器共享 98% 的函数名称。 当您考虑到驱动程序管理器将大部分处理传递给驱动程序时,这并不奇怪。 然而,一个重要的区别是 EnvironmentConnectionStatement 句柄包含不同的信息。 例如,驱动程序的 Connection 句柄通常会包含一些特定于数据库的数据,例如套接字句柄,而驱动程序管理器的 Connection 句柄通常除了指向驱动程序的 Connection 句柄的指针之外,几乎不包含任何内容。 unixODBC 包含一个驱动程序模板,对于任何有兴趣创建新驱动程序的人来说,它应该是一个很好的起点。 使用 unixODBC 将驱动程序从 Linux 移植到 Linux 或从 Linux 移植到其他平台应该非常容易,因为 unixODBC 旨在支持来自其他平台的驱动程序代码。 一个有用的驱动程序至少应实现以下函数:SQLAllocConnect、SQLFreeConnect、SQLAllocStmt、SQLFreeStmt、SQLConnect、SQLDisconnect、SQLPrepare、SQLExecute、SQLFetch、SQLGetData、SQLNumResultCols 和 SQLColAttribute。

了解驱动程序如何工作的最佳方法可能是查看一些驱动程序代码。 unixODBC 包含许多此类示例。 您的源可能会实现 driver.h 和 driverextras.h,但至少应包含 sqlext.h 和 odbcinst.h(参见图 5)。 来自其他平台的驱动程序代码可能具有其自己的 driver.h 和 driverextras.h 版本,或者可能根本没有它们; 这没关系,因为这两个包含文件在本地源目录中实现,并且不被任何其他代码使用。 您应该链接 libodbcinst.so 和任何特定于数据库的库(参见图 1)。 unixODBC 为几乎每个 Linux 用户提供了一些东西。

应用程序开发人员现在可以创建独立于平台和数据源的可移植数据访问代码。 驱动程序程序员可以使用 unixODBC 驱动程序模板开始创建新驱动程序,然后在创建安装脚本/RPM 时使用 Odbcinst。 所有 Linux 用户都可以使用 ODBCConfig 轻松地为其应用程序配置 ODBC 数据源,然后通过在 DataManager 中浏览来查看数据源中可用的资源。 易用性和功能性超越了其他已经使用 ODBC 多年的平台。 最重要的是,unixODBC 在流行的 Linux 发行版中的广泛采用将使应用程序开发人员能够假设桌面具有这些功能并加以利用。 这些功能对于让 Linux 完全被普通用户的桌面所接受至关重要。

提示

资源

Open Database Connectivity
Peter Harvey 在加拿大军队服役期间开始在 C64 上编写游戏程序,后来选择编程作为自己的职业。 他是 CodeByDesign 的创始人,该公司最近将其重点从为 MS 平台开发转向为 Linux 开发。 可以通过 pharvey@codebydesign.com 联系 Peter。
加载 Disqus 评论