Delphi知识中心
www.delphi.ee
提供Delphi技术知识
与Delphi程序员共同进步


在线服务QQ:99923144 随时恭候您的光临
首页 基础知识 WIN系统 组件使用 组件开发 数据库 ACTIVEX 多媒体技术 网络技术 关于
文章类别:数据库    你尚未登陆,会员功能无法使用,请从 网站首页 登陆。
  应用 ODBC技术访问数据源的方法及实例  
 
应用 ODBC技术访问数据源的方法及实例

金 春( 合肥工业大学计算机网络系统研究所 )

摘 要 : ODBC (Open Database Connectivity开放数据库联接)技术现在已经成为数据库通信的事实工业标准,它的应用已经深入到数据库应用的各个方面。本文首先简要介绍分析了 ODBC技术的思想特点,工作原理,然后重点分析了使用ODBC的方法步骤,最后给出在Maplnfo中应用ODBC 访问 Oracle 数据库的应用实例。
 
关键词:ODBC,驱动程序,驱动程序管理器,应用程序,数据源,句柄

1 引言

关系数据库的研究与应用是当今计算机界最活跃的领域之一,各种数据库产品行行色色,各有千秋;这种情况一方面给用户带来了好处,另一方面又给应用程序的移植带来了困难。尤其是在客户机/服务器体系结构中,当用户要从客户机端访问不同的服务器,而这些服务器的数据库系统又各不相同,数据库之间的互连访问就成为一个难题,因此,微软公司提出了ODBC。由于ODBC思想上的先进性及其微软公司的开放策略,ODBC现在已经成为事实上的工业标准,它是目前数据库应用方面很多问题强有力的解决方案,正逐步成为Windows平台上的标准接口。

2 ODBC的基本思想与主要特点

ODBC是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序设计接口(API)。它的基本思想是为用户提供简单、标准、透明、统一的数据库联接的公共编程接口,在各个厂家的支持下能为用户提供一致的应用开发界面,使应用程序独立于数据库产品,实现各种数据库之间的通信。开发厂商根据ODBC的标准去实现底层的驱动程序,它对用户是透明的。

作为一种数据库联接的标准技术,ODBC有以下几个主要特点:

1·ODBC是一种使用SQL的程序设计接口;

2·ODBC的设计是建立在客户机/服务器体系结构基础之上的;

3·ODBC使应用程序开发者避免了与数据源联接的复杂性;

4·ODBC的结构允许多个应用程序访问多个数据源,即应用程序与数据源的关系是多对多的关系。

3 ODBC的工作原理与实现

ODBC的结构是建立在客户机/服务器体系结构之上,它包含四个组件。

3.1 应用程序(Application)

应用程序即是用户的应用,它负责用户与用户接口之间的交互操作,以及调用ODBC函数以给出SQL请求并提取结果以及进行错误处理。

3.2 ODBC驱动程序管理器(Driver Manager)

ODBC驱动程序管理器为应用程序加载和调用驱动程序,它可以同时管理多个应用程序和多个驱动程序。它的功能是通过间接调用函数和使用动态链接库(DLL)来实现的,因此它一般包含在扩展名为”DLL“的文件中。

3.3 ODBC驱动程序(Driver)

ODBC 驱动程序执行ODBC函数调用,呈送 SQL 请求给指定的数据源,并将结果返回给应用程序。驱动程序也负责与任何访问数据源的必要软件层进行交互作用,这种层包括与底层网络或文件系统接口的软件。

3.3 数据源

数据源由数据集和与其相关联的环境组成,包括操作系统、DBMS 和网络(如果存在的话)。ODBC 通过引入“数据源”的概念解决了网络拓扑结构和主机的大范围差异问题,这样,用户看到的是数据源的名称而不必关心其它东。

4 应用程序如何通过ODBC访问数据源

ODBC API 实现数据库操作的手段是语句,这是一个强有力的手段。ODBC语句除了能执行SQL语句和完成查询操作之外,还能实现大多数数据库操作。应用程序一般都是通过ODBC语句来实现对不同数据源进行存取操作的。

一般地,应用程序存取数据源中的完整步骤如下所示:

(1).创建环境句柄

(2).创建联接句柄

(3).通过联接句柄联接数据源

(4).创建语句句柄

(5).通过语句句柄执行语句

(6).释放语句句柄

(7).与数据源脱离联接

(8).释放联接句柄

(9).释放环境句柄

句柄就是一个应用程序变量,系统用它来存储关于应用程序的上下文信息和应用程序所用到的一些对象。它和 Windows 编程中的概念类似,不过ODBC 更加完善了句柄的作用。ODBC 中用到三种句柄即上面提到的环境句柄、联接句柄和语句句柄;它们的关系可用图 1 所示的分层结构来表示:

wpe2.jpg (10111 字节)

 

图1

①.环境句柄是 ODBC 中整个上下文的句柄,使用 ODBC 的每个程序从创建环境句柄开始,以释放环境句柄结束。所有其它的句柄(这一应用程序所有的联接句柄和语句句柄)都由环境句柄中的上下文来管理。环境句柄在每个应用程序中只能创建一个。

②.联接句柄管理有关联接的所有信息。联接句柄可以分配多个,这不仅合法而且很有用;但不要生成不必要的句柄以免资源的浪费。

但是,不同的驱动程序支持的联接情况有所不同,有的驱动程序在一个应用程序中仅支持一个联接句柄,有的驱动程序仅支持一个语句句柄。在应用程序中,可以在任何适当的时候联接或脱离数据源,但不要轻易地建立或脱离联接。

③.语句句柄是 ODBC API 真正发挥重要作用的,它被用来处理 SQL 语句及目录函数,每个语句句柄只与一个联接有关。当驱动程序接收一个来自应用程序的函数调用指令而该指令包含一个语句句柄时,驱动程序管理器将使用存储在语句句柄中的联接句柄来将这一函数调用发送给合适的驱动程序。

总之,以上步骤是使用 ODBC 的标准步骤,但在真正的应用中,不一定完全按照以上步骤进行,具体情况要根据特定的应用环境来决定。

 

5 ODBC在Maplnfo中的应用

 

这儿的Maplnfo是美国Maplnfo公司的最新产品Maplnfo Professional V4.0,该产品是世界桌面地图信息系统的领导者,具有很多突出的优点或特点,其中一点就是它本身内置ODBC,可以方便读写远程数据。在Maplnfo 中,通过ODBC可以很方便地访问Oracle,Sybase,lnformix等数据库的数据。

Maplnfo的开发工具是它自带的MapBasic,下面这段程序就是应用 ODBC 访问 Oracle 数据库的MapBasic 程序,通过注释我们就可以对前面说明的东西有感性的认识。

(注意:在实际中,每条语句只能占一行。)

 

Include "mapbasic.def"

Include "icons.def"

Define connect_string "DSN=ORACLE7;SRV=t:whsco:scoora;USR=jxzy;PWD=

jxzy" '联接串,通过改变它就可以联接到不同的数据源

Global Dbnum As Integer '定义联接句柄

 

Sub Main

Dim curnum As Integer '定义语句句柄

Close All Interactive '环境清理

Print "正在联接Oracle数据库..."

Dbnum=Server_Connect("QELIB", connect_string)

'通过联接句柄联接数据源

Print Dbnum

Print "联接Oracle 数据库成功!"

curnum=Server_Execute(Dbnum,"select xmmc from zydmb where xmdm='HD01'"

'执行SQL语句

Server curnnm Fetch First '通过语句句柄提取数据

m_xmmc=server_columnInfo(curnum,1,SRV_COL_INFO_VALUE)

'通过语句句柄把数据放入变量中

'zydmb是一个库文件,xmmc,xmdm 是两个字段

..... '一些处理

 

Server curnum Close '释放语句句柄

Server Dbnum Disconnect '与数据源脱离联接

Print "退出Oracle 数据库成功!"

End MapInfo '退出MapInfo

End Sub

在上面的程序中,基本上是按照前面所述的步骤来进行的,但它又是不同的,它有很多步骤都没有或省略了,因为它们在Maplnfo中并不是必要的。上面还有关于执行Select语句的数据处理。

下面再举例说明lnsert语句的使用以及错误处理。假设前面已联接数据库成功,句柄还是Dbnum。

Dim str As String

Dim curnum As lnteger

Dim m_xmmc, m_xmdm As String

Str="insert into zydmb(xmmc,xmdm) Values("+ "'"+ m_xmmc+ "'"+","

+m_xmdm+"'"+")"

curnum =Server_Execute(Dbnum,str) '执行SQL语句

Server Dbnum Begin Transaction '开始事务

Server Dbnum Commit '事务提交

Server curnum Close '释放句柄

Onerror Goto err '若出错跳转

Goto ok '正确跳转

err:Print "Error!..."

Server Dbnum Begin Transaction '开始事务

Server Dbnum Rollback '事务回退

Server curnum Close '释放句柄

Server Dbnum Disconnect '与数据源脱离联接

ok: Print "OK....."

其中,str中用了字符串相加,因为m_xmmc与m_xmdm对于Oracle 数据库是外部的变量,在MapBasic中必须这样处理。

通过ODBC对数据库执行其它操作与上面的类似。

在以上示例中调用了很多函数,这些函数是由MapInfo提供的,读者不需详细了解它们,只要知道在何时需要调用能完成何种功能的函数就可以了,因为不同的开发环境会有不同的函数。在其它开发环境下调用其它类型数据库可以参照前面的说明和例子并结合适当的手册进行。

6 结束语

作为一种跨平台的解决方案,ODBC 不仅解决了客户机/服务器体系结构上的数据库联接问题,同时也能解决桌面数据库的联接问题,而且它还能对可映射为二维表格的几乎所有的数据进行联接访问,如在电子表格、文本文件以及面向文件的数据存储中生效。ODBC 本身足够灵活,它可以适应各种类型的数据源,虽然它的焦点是数据库。

总之,近年来,ODBC 得到了快速的发展,使用也日益广泛。它作为一项重要的技术,在各大厂商的合作和努力下,以及随着SQL的推广和规范,用户和开发商都会更加依赖这一技术。ODBC 技术必将得到更大的发展,它的使用也必将越来越广泛,越来越深入。

 

 

参 考 文 献

1. .曹康,曹永胜,王洁等译. ODBC 深入剖析.北京:电子工业出版社,1996
2. 岳红宇,金以慧,郭宇春.全面了解 ODBC 技术.计算机世界,1995,12:

3. 萨师煊,王珊.数据库系统概论.北京:高等教育出版社,1993

4. MapInfo公司. MapInfo 使用手册

 

在线服务QQ:99923144 Delphi程序员QQ群(139442)
Delphi知识中心 www.delphi.ee 最专业的Delphi技术资料网站