当今活跃的数据库研究与应用领域,以关系数据库为代表的产品已走向成熟。小型数据
库(如Foxpro,Access,Paradox,Dbase,Betrieve等)百花争艳,大型数据库(如Oracle
,Sybase,Ingres,Informix,DB2,MS SQL Server等)分割天下。面对这样的局面,作为用
户感到既喜又忧:喜的是用户可以有充分的选择自由,并在竞争中得到利益的保障;忧
的是各数据库产品间难以互通,给应用程序的移植带来困难。因此,如何解决异构型数
据库之间的数据共享,便成为人们多年来研究的课题。ODBC(Open Data-base Connec
tivity 开放数据库互连)正是为了解决这一问题而产生的。
一、ODBC概念及其工作原理概述
ODBC 最初是由制订UNIX标准的两个组织X/OPEN 财团和 SQL Access Group提出的,而M
icrosoft公司是ODBC强大的支持者和技术实现者。它首当其冲地在Visual C++ ,Visu
al Basic中支持了ODBC的开发,并把ODBC确定为 WOSA ( The Windows Open System A
rchitecture Windows 开放系统体系结构)的主要部分,使其成为基于Windows环境的一
种数据库访问接口标准。 ODBC为异构数据库的访问提供了统一的接口,它允许应用程序
以SQL(Structured QueryLanguage)为数据存取标准,来存取不同的数据库管理系统(
DBMS)管理的数据。换句话说ODBC是一个数据库访问库, 可以使应用程序直接操纵数据
库中的数据,而免除随数据库的改变而改变。用ODBC可以访问AS/400上的DB2,可以操纵
笔记本电脑上的 BETRIEVE文件,甚至可以访问如Excel电子表格和ASCII数据文件这类的
非数据库对象。 ODBC何以能操纵如此众多的数据库? 这是由于当前绝大部分数据库都全
部或部分地遵从E.F.Codd所提出的关系数据库概念, 甚至基于文件管理系统的产品都向
关系模型靠拢。ODBC在看待这些数据库时,正是着眼了这些共同点。 ODBC的基本特色是
使应用程序独立于数据库。 它提供了最大限度的相互可操作性(Interoperatabil_ ity
),一个应用程序可通过一组通用代码访问不同的DBMS,一个软件开发者开发的客户/服
务器应用程序,不会被束缚在某个特定的数据库上。应用程序不必和DBMS绑在一起进行
编译、连接、运行,而只要在应用程序中通过选择一个叫作数据库驱动程序(Database
Driver)的模块就可以把应用程序与所选的DBMS连接在一起了。数据库驱动程序是ODBC引
入的新思想新概念,它是ODBC的灵魂,实际上是一个用以支持ODBC函数调用的模块, 通
常是一个动态链接库DLL(Dynamic-Link Libriaries),类似Windows下的打印驱动程序
。所以,应用程序要操作不同类型的数据库,只要调用ODBC所支持的函数,动态链接到
不同的驱动程序上即可。
二、 ODBC体系结构分析
ODBC的分层结构 使用ODBC的大部分动机源于它良好的数据库独立性,ODBC 所以有这个
特色是因为它使用层次的方法来管理数据,即在数据库通信结构的每一层,对可能出现
依赖产品的地方,ODBC都引入一个公共接口以解决潜在的不一致性。 ODBC的分层结构包
括四个组件:
⑴ ODBC函数接口(ODBC API):负责提交SQL语句,提取结果;
⑵ 驱动程序管理器(Driver Manager):为应用程序加载驱动程序;
⑶ 驱动程序(Driver):处理ODBC函数调用,向数据源提交SQL请求,向应用程序返回结
果,必要时驱动程序将SQL语法翻译成符合DBMS语法规定的形式;
⑷ 数据源(Data Source):由用户想要存取的数据、操作系统、DBMS、网络平台等组成
。
ODBC函数接口(ODBC API) ODBC API是ODBC运用数据通信方法、数据传输协议、DBMS等多
种技术定义的一个标准的接口。应用程序通过ODBC API 与数据源进行数据交换。向ODB
C提交的SQL语句是以ODBC函数的参数形式给出的,SQL 语句不依赖于具体的DBMS。 ODB
C API一般涵盖如下内容:
⑴ 请求与数据源建立联系,创建一个会话;
⑵ 向数据源发出SQL请求;
⑶ 定义一个缓冲区和数据格式,用来存储SQL请求的结果;
⑷ 提取结果;
⑸ 处理各种错误;
⑹ 给用户报告结果;
⑺ 事务提交或事务撤消;
⑻ 中断与数据源的连接。
ODBC接口具有相当的灵活性:
⑴ 构成SQL语句的字符串可以在源程序中直接给出,也可以在运行时动态生成;
⑵ 同一个程序可以存取不同的DBMS;
⑶ 应用程序不必关心ODBC与DBMS之间的底层通信协议;
⑷ 数据值可以用应用程序最方便的格式传递。
ODBC驱动程序管理器(Driver Manager) 驱动程序管理器是一个带有入口函数库的动态链
接库DLL,由 Microsoft提供,可以链接到所有的 ODBC 应用程序中。 驱动程序管理器
是应用程序与ODBC驱动程序之间的桥梁,负责管理应用程序和ODBC驱动程序之间的通信
。当用户需要数据或其它数据库操作时,应用程序传一个ODBC函数调用给ODBC的驱动程
序管理器,在接到这样的调用后,它决定下一步要做的工作。当驱动程序管理器可以直
接处理时(如某些游标操作),即在处理毕后将结果(如返回码)回送给应用程序,若驱动
程序管理器需调用驱动程序中的函数时,则执行这样的调用,并将结果返回给应用程序
。
ODBC驱动程序(Driver) 数据库驱动程序是ODBC的灵魂。ODBC 通过使用驱动程序来保持
数据库的独立性。各主要数据库厂家都提供支持ODBC的驱动程序,如操作Paradox数据库
一定要使用Paradox的ODBC驱动程序。 ODBC驱动程序作为应用程序和特定数据库之间的
接口,不同于通常的DBMS接口,应用程序通过调用驱动程序所支持的函数来操纵数据库
。若想使应用程序操作不同类型的数据库,就要动态地链接到不同的驱动程序上。对于
同一个驱动程序支持的数据库,ODBC将提供基本上统一的接口。 通常情况下,当应用程
序调用函数SQL Browse Connect,SQL Connect,SQL Driver Connect时,驱动程序管理
器加载驱动程序。根据应用程序的要求,驱动程序完成以下任务:
⑴ 建立与数据源的连接;
⑵ 向数据源提交请求;
⑶ 根据应用程序的需要,完成数据格式转换;
⑷ 把结果返回给应用程序;
⑸ 把错误整理成错误代码,并返回给应用程序;
⑹ 申请并控制游标(这一操作对应用程序透明);
⑺ 根据数据源的需要,完成事务初始化(这一操作对应用程序透明)。
数据源(Data Source) 数据源由用户想要存取的数据、相应的DBMS、DBMS所在的系统平
台、网络等组成,每个数据源都需要驱动程序提供一定的信息。在核心级,这些信息包括
数据源名称、用户名及口令等 。ODBC 扩充级允许驱动程序指定更多的信息,如网络地址
、网络登录口令等。 ODBC数据源的配置一般有两种方法:
⑴ 通过ODBC管理器(ODBC Adminitrator) ODBC管理器对于ODBC应用程序是不可缺少的,
它除了管理数据源之外,还负责安装驱动程序,并帮助程序员跟踪ODBC的函数调用。 可以
通过很多途经获得ODBC管理器,如MS VISUAL C++或MS ODBC 2.0 SDK等。
⑵ 利用ODBC API自己编写程序来配置数据源 要创建自己的数据源管理程序必须使用OD
BC SDK提供的Installer DLL,该Indtaller DLL提供了一些函数供程序来增加、修改、
删除数据源,或删除缺省的数据源,选择翻译程序等。这些函数与驱动程序的Setup DL
L、翻译程序的Setup DLL一起工作,其中驱动程序的Setup DLL用来返回驱动程序与数据
源连接的信息,翻译程序的Setup DLL用来返回数据源的缺省翻译程序。 各数据源的连
接信息,存储在文件ODBC.INI中(对于Windows) 或 HKEY-CURRENT-USER\SOFTWARE\OD
BC\ODBC.INI中(对于Windows NT),该文件在安装数据源时建立,由管理程序来维护。文
件中,有一段文本专门用来列出可用的数据源,对每一数据源都有一段文本对之进行描
述,如定义驱动程序名、说明,以及一些驱动程序连接数据源时必要的信息。
四、ODBC驱动程序类型及其结构
ODBC驱动程序类型 ODBC定义了两种类型的驱动程序,用来表示驱动程序与相关的DBMS的
分工程度。 ⑴ 单层式驱动程序(Single-Tier Driver) 驱动程序既处理ODBC函数调用
又处理SQL语句,相当于完成一部分数据源的工作。
⑵ 多层式驱动程序(Multiple-tier Driver) 驱动程序只处理ODBC函数调用,而把SQL
语句交给数据源去处理。单层式驱动程序要比多层式驱动程序负担更多的工作,但多层
式驱动程序要复杂得多,因为通常它要支持更高级别的API和SQL功能。 对于一个系统来
说,可以同时配有两种类型的驱动程序。
驱动程序的结构及其配置
⑴ 单层式 单层式驱动程序近似等价于本地型DBMS,它介于应用程序和数据库之间,类
似一种中介程序,为非客户/ 服务器数据提供一种统一的通信方式。对单层式驱动程序
,数据库文件是直接由驱动程序来处理的,驱动程序处理SQL语句并从数据库中提取结果
。图2给出了使用单层式驱动程序情况下数据库通信结构,从中可以体会单层式驱动程序
的位置。 从上图我们可以体会到,单层式驱动程序实际上充当了数据库引擎的角色,它
不需要别的帮助即可完成相应的工作,它与本地型的DBMS相同, 是完全自含式的。 单
层式ODBC驱动程序可以配置在单机上,也可以配置在网络环境中,图3显示了两种单层式
驱动程序的配置。 网络环境下,对单层式驱动程序来说,数据存放在网络文件服务器的
什么地方并不重要,因为对数据的访问是交付网络操作系统来完成的。
⑵ 多层式 多层式驱动程序,负责在数据库引擎和客户应用程序间传送命令和数据,它
本身并不执行数 据处理操作,而仅是一个中继站。图4给出了数据库通信结构中多层式
驱动程序的位置。
在多层式驱动程序中,用户请求和结果返回的流程如下:
① 前端应用程序提出对数据或数据库处理的请求,该请求转给ODBC驱动程序管理器;
② 驱动程序管理器依据请求的情况,或就地完成或传给驱动程序;
③ 多层式驱动程序,将请求翻译为特定厂商的数据库通信接口所能理解的形式,并交与
接口去处理; ④ 接口把请求经网络发送给服务器上的数据库引擎;
⑤ 服务器处理完请求后,把结果发回给数据库通信接口;
⑥ 数据库接口将结果传给多层式ODBC驱动程序;
⑦ 多层式驱动程序再将结果传给应用程序,通常是数据缓冲区中;
⑧ 前端应用程序将结果按适当的形式展示给用户。 多层式驱动程序一般配置在客户/服
务器环境中。应用程序、驱动程序、驱动程序管理器在一个系统中,叫做客户;数据库
及控制数据存取的软件在另一个系统里,叫做服务器。即使ODBC所有的组成部分都装在
一个系统中,它们也被分成若干层而分布在系统里。另外一种多层式驱动程序的配置是
基于网关机制的,驱动程序把SQL请求送到网关进程,由网关进程把请求送到数据源。图
5给出了多层式驱动程序的三种配置。 从应用程序的角度出发,以上三种配置都是相同
的。
五、ODBC一致性级别 (Conformance Levels)
ODBC的优点是具有互操作性,在确定数据源之前程序员就可以编写应用程序,数据源的
选择可以在程序运行后再确定。从应用程序的角度看,最理想的情况是所有的数据源都
支持相同的函数调用和SQL语句。不幸的是,不同数据源及相关的驱动程序提供的函数和
SQL语法有所不同,为此ODBC定义了一致性级别(Conformance Levels)。一致性级别定义
了一个具体的驱动程序应支持哪些函数及SQL语句。 ODBC从两个方面来定义一致性级别
:ODBC API和ODBC SQL语法(包括ODBC SQL数据类型)。一致性级别通过建立一套标准的
功能来帮助应用程序开发者和驱动程序开发者。应用程序就可很容易知道一个驱动程序
是否支持它所需要的功能。 如果一个驱动程序声明它支持某一个API一致性级别或某一
个SQL一致性级别,那么该驱动程序就应该支持该一致性级别中定义的全部功能,而不管
这些功能是否被相应的DBMS支持。一致性级别并不限制驱动程序只能支持规定的功能,
而是鼓励驱动程序开发者支持尽可能多的功能。应用程序可以通过调用函数SQL_Get_Ty
pe_Info来查询一个驱动程序到底支持哪些功能。
ODBC API的一致性级别 API一致性级别决定了应用程序所能调用的函数的种类。ODBC定
义了三套API一致性级别的函数:API一致性的核心级;API一致性的扩展级1;API一致性
的扩展级2。
⑴ 核心级 核心级API仅包括最基本的功能,共有23个函数。这23个函数构成了驱动程序
的核心。核心级API具有如下功能: ① 分配和释放环境句柄、数据库连接句柄、语句句
柄; ② 连接数据源,在一个连接中可以作用多个语句; ③ 准备并执行SQL语句; ④
为SQL语句的参数和结果分配缓冲区; ⑤ 提取结果及有关信息; ⑥ 提交或撤销事务;
⑦ 提取错误信息。 ⑵ 扩展级1 扩展级1在核心级的基础上新增加了19个函数。大多数
的驱动程序支持扩展级1。扩展级1的最大优点是,在编写程序时即使对表的情况一无所
知,依然能在运行时动态地操作表。扩展级1 API具有如下功能: ① 具有核心级API的
全部功能; ② 用驱动程序规定的对话框连接数据源; ③ 传送一个参数值的部分或全
部; ④ 提取一个列值的部分或全部; ⑤ 提取词典信息(列、统计、表等); ⑥ 提取
驱动程序和数据源的兼容性信息,如支持的数据类型、数量函数、ODBC函数等。 ⑶ 扩展
级2 扩展级2在扩展级1的基础上又增加了19个函数。在扩展级2中很多扩展功能仅适用于
客户/服务器结构的数据库,只有当应用程序需要运行在真正的客户/服务器结构上时,
扩展级2才有实际价值。扩展级2 API具有如下功能: ① 具有核心级和扩展级1 API的全
部功能; ② 浏览连接信息和可用的数据源清单; ③ 传送若干组参数值,提取若干组列
值; ④ 提取参数个数及单个参数的描述信息; ⑤ 使用游标; ⑥ 提取SQL格式; ⑦
提取词典信息(权限、关键词、过程); ⑧ 调用翻译程序DLL。
ODBC SQL语法一致性级别 驱动程序的SQL一致性级别决定了ODBC语句中能使用的SQL语法
的类型,以及能使用的数据类型。ODBC的 SQL一致性级别分为以下三个级别:最小级SQ
L语法;核心级SQL语法;扩展级SQL语法。
⑴ 最小级SQL语法 ① 数据定义语言(DDL):CREATE TABLE和DROP TABLE; ② 数据操纵
语言(DML):简易SQL,INSERT,UPDATE SEARCHED和DELETE SEARCHED; ③ 表达式:简
易型(例如A>B+C); ④ 数据类型:CHAR,VARCHAR,LONG VARCHAR。
⑵ 核心级SQL语法 ① 最小级SQL语法和数据类型; ② 数据定义语言(DDL):ALTER TA
BLE,CREATE INDEX,DROP INDEX,CREATE VIEW,DROP VIEW,GRANT和REVOKE; ③ 数
据操纵语言(DMC):全部SELECT; ④ 表达式:子查询及组函数(如SUM和MIN); ⑤ 数据
类型:DECIMAL,NUMERIC,SMALLINT,INTEGER,REAL,FLOAT,DOUBLE PRECISION。
⑶ 扩展级SQL语法 ① 最小级和核心级SQL语法和数据类型; ② 数据操纵语言(DML):
外连接、定位UPDATE、定位DELETE、SELECT FOR UPDATE、联合操作; ③ 表达式:数量
函数(Scalar functions),如SUBSTRING、ABS、日期、时间等; ④数据类型:BIT,TI
NYINT,BIGINT,BINARY,VARBINARY,LONG VARBINARY,DATE,TIME,TIMESTAMP; ⑤
批量SQL语句; ⑥ 过程调用。
六、结束语
作为应用程序开发者,有很多理由使用ODBC。如果希望应用程序能同时支持多种数据库
,ODBC是明智的选择。不过虽然ODBC在支持多数据库方面是强有力的,但过高的要求它
支持每一种驱动程序是不现实的,因为在应用程序中所乐于采用的高级特征不一定能被
基本驱动程序支持。 如果应用程序只需支持一种DBMS,依然有充足的理由选用ODBC。开
发人员只需掌握ODBC的开发方法,就能开发其他大多数的数据库产品,这样可以省一笔
资金和精力,避免去学习其他数据库的API。客户/服务器环境下的开发者并不经常接触
他所要涉及的实际数据库,在开发应用程序时,如果采用了ODBC,只需针对本地的DBMS
进行应用程序开发,也能适应实际系统的需要。作为一个编程者也许会有这种感觉,在
开发伊始就选择好合适的DBMS并不是一件容易事,而当采用了ODBC后,对DBMS的选型工
作可以延迟一段时间,而开发工作可以提前进行。ODBC将得到越来越广泛的应用。
ODBC体系结构分析
原创文章如转载,请注明:转载自悠悠博客 [ http://www.ajaxstu.com/ ]
相关文章:
- AOD connection属性:CursorLocation DefaultDatabase IsolationLevel Provider(2007-9-27 1:31:3)
- 创建 Recordset 的快捷方式(2007-9-8 11:2:30)
- 返回 ADO 的版本号(2007-8-23 6:56:17)
- 通过脚本语言使用 ADO(2007-5-25 9:19:48)
- ADO:Stream 对象(2007-4-13 8:21:11)
- 通过 ADO 使用提供者(2007-3-13 2:37:3)
- ADO connection 对象 :open和close方法(2007-3-11 9:28:30)
- 绝对和相对 URL(2007-3-8 6:2:15)
- ADO connection 对象包含的内容(2007-1-26 10:55:29)
- 文献:ADO原理与方法(2006-11-21 1:59:2)
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
