ODBC编程
本节介绍如何使用ODBC来进行数据库应用程序的设计。使用ODBC编写的应用程序可移植性好,能同时访问不同的数据库,共享多个数据资源。
ODBC概述
提出和产生ODBC的原因是存在不同的数据库管理系统。
目前广泛使用的关系数据库管理系统有多种,尽管这些系统都属于关系数据库,也都遵循SQL标准,但是不同的系统有许多差异。因此,在某个关系数据库管理系统下编写的应用程序并不能在另一个关系数据库管理系统下运行,适应性和可移植性较差。例如,运行在Oracle上的应用系统要在KingbaseES上运行,就必须进行修改移植。这种修改移植比较烦琐,开发人员必须清楚地了解不同关系数据库管理系统的区别,细心地一一进行修改、测试。
但更重要的是,许多应用程序需要共享多个部门的数据资源,访问不同的关系数据库管理系统。为此,人们开始研究和开发连接不同关系数据库管理系统的方法、技术和软件,使数据库系统“开放”,能够实现“数据库互连”。其中,ODBC就是为了解决这样的问题而由微软公司推出的接口标准。ODBC是微软公司开放服务体系(Windows Open Services Architecture,WOSA)中有关数据库的一个组成部分,它建立了一组规范,并提供一组访问数据库的应用程序编程接口(Application Programming Interface, API)。ODBC具有两重功效或约束力:一方面规范应用开发,另一方面规范关系数据库管理系统应用接口。
ODBC工作原理概述
ODBC应用系统的体系结构如下图所示,它由4部分构成:用户应用程序、ODBC驱动程序管理器、数据库驱动程序、数据源(如关系数据库管理系统和数据库)。

①用户应用程序
用户应用程序提供用户界面、应用逻辑和事务逻辑。使用ODBC开发数据库应用程序时,应用程序调用的是标准的ODBC函数和SQL语句。应用层使用ODBC API调用接口与数据库进行交互。使用ODBC来开发应用系统的程序简称为ODBC应用程序,包括的内容有:
请求连接数据库。
向数据源发送SQL语句。
为SQL语句执行结果分配存储空间,定义所读取的数据格式。
获取数据库操作结果或处理错误。
进行数据处理并向用户提交处理结果。
请求事务的提交和回滚操作。
断开与数据源的连接。
②ODBC驱动程序管理器
驱动程序管理器用来管理各种驱动程序。ODBC驱动程序管理器由微软公司提供,它包含在ODBC32.DLL中,对用户是透明的,管理应用程序和驱动程序之间的通信。ODBC驱动程序管理器的主要功能包括装载ODBC驱动程序、选择和连接正确的驱动程序、管理数据源、检查ODBC调用参数的合法性及记录ODBC函数的调用等,当应用层需要时返回驱动程序的有关信息。
ODBC驱动程序管理器可以建立、配置或删除数据源,并查看系统当前所安装的数据库ODBC驱动程序。
③数据库驱动程序
ODBC通过数据库驱动程序来提供应用系统与数据库平台的独立性。
ODBC应用程序不能直接存取数据库,其各种操作请求由驱动程序管理器提交给某个关系数据库管理系统的ODBC驱动程序,通过调用驱动程序所支持的函数来存取数据库。数据库的操作结果也通过驱动程序返回给应用程序。如果应用程序要操纵不同的数据库,就要动态地链接到不同的驱动程序上。
目前的ODBC驱动程序主要有单束和多束两类。单束一般是数据源和应用程序在同一台机器上,驱动程序直接完成对数据文件的I/O操作,这时驱动程序相当于数据管理器。多束驱动程序支持客户机-服务器、客户机-应用服务器/数据库服务器等网络环境下的数据访问,这时由驱动程序完成数据库访问请求的提交和结果集接收,应用程序使用驱动程序提供的结果集管理接口操纵执行后的结果数据。
④ODBC数据源管理
数据源是最终用户需要访问的数据,包含了数据库位置和数据库类型等信息,实际上是一种数据连接的抽象。
ODBC给每个被访问的数据源指定唯一的数据源名(Data Source Name,DSN),并映射到所有必要的、用来存取数据的低层软件。在连接中,用数据源名来代表用户名、服务器名、所连接的数据库名等。最终用户无须知道数据库管理系统或其他数据管理软件、网络以及有关ODBC驱动程序的细节,数据源对最终用户是透明的。
例如,假设某个学校在SQL Server和KingbaseES上创建了两个数据库:学校人事数据库和教学科研数据库。学校的信息系统要从这两个数据库中存取数据,为了方便地与两个数据库连接,为学校人事数据库创建一个数据源名PERSON,PERSON就是一个DSN。同样,为教学科研数据库创建一个名为EDU的数据源。此后,当要访问每一个数据库时,只要与PERSON和EDU连接即可,不需要记住使用的驱动程序、服务器名称、数据库名等。所以在开发ODBC数据库应用程序时首先要建立数据源并给它命名。
ODBC API基础
各个数据库厂商的ODBC应用程序编程接口(ODBC API)都要符合两方面的一致性:
API一致性,包含核心级、扩展1级、扩展2级。
语法一致性,包含最低限度SQL语法级、核心SQL语法级、扩展SQL语法级。
①函数概述
ODBC 3.0标准提供了76个函数接口,大致可以分为:
分配和释放环境句柄、连接句柄、语句句柄。
连接函数(SQLDriverconnect等)。
与信息相关的函数(SQLGetinfo、SQLGetFuction等)。
事务处理函数(如SQLEndTran)。
执行相关函数(SQLExecdirect、SQLExecute等)。
编目函数,ODBC 3.0提供了11个编目函数,如SQLTables、SQLColumn等。应用程序可以通过对编目函数的调用来获取数据字典的信息,如权限、表结构等。
注意:ODBC不同版本上的函数和函数的使用是有差异的,读者必须注意使用的版本,目前最新的版本是ODBC 3.8。
②句柄及其属性
句柄是32位整数值,代表一个指针。ODBC 3.0 中句柄可以分为环境句柄、连接句柄、语句句柄和描述符句柄4类,对于每种句柄,不同的驱动程序有不同的数据结构,这4种句柄的关系如下图所示。

(1)每个ODBC应用程序需要建立一个ODBC环境,分配一个环境句柄,存取数据的全局性背景,如环境状态、当前环境状态诊断、当前在环境上分配的连接句柄等。
(2)一个环境句柄可以建立多个连接句柄,每一个连接句柄实现与一个数据源之间的连接。
(3)在一个连接中可以建立多个语句句柄,它不只是一个SQL语句,还包括SQL语句产生的结果集以及相关的信息等。
(4)在ODBC 3.0中又提出了描述符句柄的概念,它是描述 SQL 语句的参数、结果集列的元数据集合。
③数据类型
ODBC定义了两套数据类型,即SQL数据类型和C数据类型。SQL数据类型用于数据源,而C数据类型用于应用程序的C代码。它们之间的转换规则如下表所示。SQL数据通过SQLBindcol从结果集列中返回到应用程序变量:如果SQL语句含有参数,应用程序为每个参数调用SQLBindparameter,并把它们绑定至应用程序变量。应用程序可以通过SQLGetTypeInfo来获取不同的驱动程序对于数据类型的支持情况。








