9.2.3 调用层接口方式及ODBC接口
9.2.3.1 调用层接口概述
前面所述的两种数据交换方式均起源于单机集中式结构,但是自网络出现后,分布式系统的发展使得数据交换的环境有了本质的改变。在网络环境下,数据共享性得到了进一步扩展,而传统的数据与应用的捆绑结构模式已不适应网络环境,为使数据在网上得到充分的共享,将数据库系统中的数据与应用分离已成为必然趋势,因此数据库系统结构方式由统一、集中方式改变成“功能分布方式”,亦即是将过去统一、僵化的数据库(应用)系统分离成“数据”与“应用”两部分,再通过一定接口将其连接起来,它们在物理上分布于网络不同结点,而在逻辑上则组成一个整体。这种方式可以使数据在网络中具有一定独立性,它可以为网络中多个应用所共享,同时网络中的每个应用也可以共享多个数据源,因此,这种结构无疑为扩展网上的数据共享提供了结构上方便,这种结构我们一般称之为C/S结构,而连接应用结点与数据结点的接口一般是一种专用接口工具。在此情况下,应用程序与数据库间的数据交换实际上成为网上两个接点间的数据通讯,它们称为调用层接口,即通过应用程序调用以接口方式实现数据交换。
目前有关调用层接口的标准及产品有三种,它们是:
(1)SQL′99中的SQL/CLI———这是调用层接口的国际标准。
(2)ODBC———这是微软的标准,并有相应产品,它适用于SQL Server 2000中及其它多种微软产品中,如Access、VFP等,从标准角度看ODBC与SQL/CLI大致相近。
(3)JDBC———这是UNIX下基于JAVA的标准并有相应产品,它适用于ORACLE等系统中,JDBC从标准角度看与SQL/CLI也大致相近。
在调用层接口中目前使用最为广泛的是ODBC,它也是SQL Server 2000中使用的接口,因此在本章中主要介绍ODBC标准。
9.2.3.2 ODBC介绍
1)ODBC接口
ODBC是一个层次结构体系,它由四个部分组成,其示意图可见图9.30。
(1)应用程序
应用程序的功能是调用ODBC函数,实现连接数据源,递交SQL语句以及返回数据的接收处理与断开连接。在ODBC中应用程序可用C、C++、JAVA等多种语言编写,但以C为常见。
所要注意的是应用程序递交SQL语句是以ODBC函数中的参数形式出现。
(2)驱动程序管理器
驱动程序管理器是一个动态链接库DLL(dynamic link library)用于连接管理各种DBMS的驱动程序。
(3)驱动程序
驱动程序是一组针对固定数据源的ODBC函数执行码,它存放于动态连接库DLL中供应用程序调用,一个ODBC接口一般可连接若干数据源,因此一般而言一个ODBC可以有若干个驱动程序。
(4)数据源
在ODBC中数据源提供数据,它可以是各种类型数据库,如Oracle,Sybase,DB2,SQL Server等,也可以是各种类型的文件结构。如Word、Excel等文件组织形式。
图9.30给出了ODBC的一个层次结构。
图9.30 ODBC结构示意图
2)ODBC与数据交换管理
ODBC是在网络中基于C/S结构的数据交换接口的一种标准,在ODBC中共有接口四种,它们是:标量与集合量间接口,应用结点与数据结点间接口,主体与客体间的同步接口以及变量的参数间的接口等,它们所涉及的交换管理有四种:
●连接管理
●动态SQL
●游标管理
●诊断管理
而ODBC即是这四个管理标准的汇总。在ODBC中它的标准与ISO标准中的SQL/CLI有一定的差别,我们分别介绍之:
(1)连接管理
在ODBC中有两种类型的连接,一种是与数据源的连接,另一种是句柄的分配,因为在实际操作时,除了须做丙数据源的连接外,还须分配给一定的内存空间以便操作之用,因此在ODBC中共有下面几个函数:
●SQLConnect
用它建立应用程序的数据源间之连接。
●SQLAllocHandle
用它以分配内存空间。该语句一共有三种,它们分别是分配环境句柄,分配连接句柄以及分配语句句柄。
同样,还有相应的两个函数以分别断开数据源及释放内存空间,它们是:
●SQLFreeHandle
●SQLDlsConnect
(2)动态SQL
在ODBC中动态SQL主要实现SQL语句中的动态参数为主,在实现时用问号“?”表示动态参数以起估位作用。同时在ODBC中有一个“绑定参数”函数,SQLBindparameter用它可将描述符区中的变量的“?”建立关联以实现动态参数的固定化。在ODBC中描述符区可用一个主程序中的变量替代,这样,整个动态SQL的结构可由下面的图9.31表示为:
图9.31 ODBC中动态参数形成结构图
而整个动态SQL形成的操作过程如下:
①在主程序中定义变量:d;
②在主程序中将形成的动态参数送入d;
③用SQLPrepare:在其中SQL语句动态参数处用“?”表示;
④用SQLBindparameter以建立变量d与?间的关联;
⑤用SQLExecute执行之。
为方便起见,在ODBC中同步实现对动态参数的成组绑定。
(3)游标
在ODBC中游标只有两个函数即是:
SQLFetch
SQLCloseCursor
而游标中的其它语句均不可被其它函数替代:
●DECRALE语句可用ODBC中的绑定副函数SQLBindCol取代,该函数将SQL查询结果集绑定于主程序指定变量上,这种绑定在必要时可用数组形式出现。
●OPEN语句可用ODBC中的执行语句(SQLExecute或SQLExecDirect)替代。
●CLOSE语句有时可用ODBC中诊断语句替代,当诊断语句中出现“SQL_NO_DATA”时游标自行关闭。
(4)诊断
在ODBC中诊断可用一个主程序中的固定变量retcode实现。
游标执行的一般过程如下:
①用SQLBind Col以绑定列
②用SQLFetch以推进游标
③用retcode以诊断结果,同时建立循环
④环循结束关闭游标。
3)ODBC工作流程
ODBC主要用于建立客户机与服务器间数据交互的接口,其工作流程可分为三个步骤。首先是建立应用程序与数据源的连接以确立接口关系,其次是数据交换,即应用向数据源发送SQL语句,数据源接到语句后做处理并将结果返回,最后断开与数据源的连接,所有这三个步骤都通过应用程序调用ODBC函数而实现。
在ODBC中需使用连接管理动态SQL、游标管理及诊断管理等四种数据交换管理。首先在第一个步骤中需用连接管理以建立应用程序与数据源的连接。其次,在数据交换中需建立主语言变量与SQL参数间的接口,此时要使用动态SQL,此后在查询结果处理时需使用游标管理与诊断管理。最后,第三个步骤中需使用连接管理以断开两个结点间的连接。
下面我们对这三个步骤作介绍。
(1)建立应用程序与数据源的连接
建立应用程序与数据源的连接包括几个内容,它们是分配应用程序、数据源、SQL语句句柄以及建立与数据源的连接。其中句柄(handle)是一个应用程序变量,它表示一块存贮区域。
①分配环境句柄
环境句柄(environment handles)定义一个数据库环境,它是ODBC中整个上下文的句柄,用于存储应用环境的全局信息,每个应用程序只有一个环境句柄,在开始连接时首先须申请环境句柄,它用ODBC中的分配环境句柄函数实现:
SQLAllocHandle(ENV)
②分配连接句柄
连接句柄(connection handles)用于定义每个数据源环境,应用程序每连接一个数据源都必须分配一个连接句柄。一个连接句柄仅与一个环境句柄相连,而一个环境句柄则可与多个连接句柄相连,申请连接句柄可用ODBC中的分配连接句柄函数实现:
SQLAllocHandle(DBC)
③连接数据源
在分配了环境句柄和连接句柄后应用程序就可以与数据源相连接,申请与数据源相连接可用ODBC中的连接数据源函数:
SQLConnect(hdbc,szDSN,cbDSN,szUID,cbUID,szAuthStr,cbAuthStr)
其中参数hdbc是一个已分配的连接句柄,参数szDSN,cbDSN分别表示数据源名称及长度,参数szUID,cbUID,分别表示用户标识符及长度,参数szAuthStr及cbAuthStr分别表示权限字符串及长度。
④分配语句句柄
语句句柄(statement handles)用于定义一个SQL语句的句柄,一个语句句柄只与一个连接句柄相连,而一个连接句柄则可与多个语句句柄相连,申请语句句柄可用ODBC中的分配语句句柄函数实现:
SQLAllocHandle(STMT)
用上述ODBC函数可以建立应用程序与数据源间的连接,其一般的连接次序是先申请环境句柄,再申请连接句柄,在取得此句柄后即可建立与数据源的连接,此后在执行SQL语句前申请语句句柄,在取得此句柄后即可执行SQL语句,其示意图可见图9.32。
图9.32 ODBC连接示意图
(2)应用程序与数据源交互
在建立了应用程序与数据源连接后即进入了应用程序与数据源交互阶段,它包括:向数据源发送SQL语句,数据源执行SQL语句并返回结果,应用程序获取查询结果等内容。
①发送并执行
ODBC提供两种方法向数据源发送SQL语句并执行,它们是直接执行方法与有准备执行方法:
●直接执行方法
直接执行方法即是一次性快捷方式执行,其ODBC函数如下:
SQLExecDirect(hstmt,szSqlStr,cbSqlStr)
其中hstmt是指语句句柄,而szSqlstr及cbSqlstr则分别表示将执行的SQL语句字符串及其长度。
该函数将SQL语句以参数方式传送给数据源执行。
●有准备执行方法
如果SQL语句需要执行几次或执行前需要有关结果集合准备信息,此时则采用有准备执行的方法较好,这种方法需要使用两个ODBC函数,首先是用预备函数SQLPrepare,其次用执行函数SQLExecute。
●预备函数
SQLPrepare(hstmt,szSqlStr,cbSqlStr)
其中参数hstmt指向语句句柄,而szSqlStr及cbSqlStr则分别表示SQL语句的字符串及其长度。
用此函数将SQL语句以参数方式发送至数据源。
●执行函数
SQLExecute(hstmt)
其中参数hstmt指向语句句柄。
用此函数可以执行SQL语句。
②结果的获得
应用程序在用ODBC函数发送SQL语句并执行后即可获得查询结果,它可用ODBC中的游标函数获取。
在ODBC中游标函数是:
SQLFetch(hstmt)
其中参数hstmt是一个语句句柄,该函数的功能是将游标从hstmt所示的元组集合中由一行移向下一行。
③参数绑定
在ODBC中存在着主程序中变量与SQL参数间的接口,在发送并执行中需建立语句句柄hstmt与主程序变量的接口,在结果获取中又需建立语句句柄hstmt与主程序变量的接口。它们称为参数绑定,分别用ODBC中的两个函数实现:
SQLBindparameter
SQLBindCol
上面的六个ODBC函数给出了应用与处理交互的基本处理要求,其处理流程的次序如下图9.33所示。这个图表示了数据交换的大致过程。
图9.33 ODBC处理流程示意图
(3)断开应用程序与数据源的连接
与建立应用程序与数据源的连接类似,断开应用程序与数据源的连接包括释放环境句柄、释放数据源句柄、释放SQL语句句柄以及断开与数据源连接,它们分别可用下面的ODBC函数:
①释放环境句柄函数
SQLFreeHandle(ENV)
②释放连接句柄函数
SQLFreeHandle(DBC)
③释放语句句柄函数
SQLFreeHandle(STMT)
④断开数据源函数
SQLDisConnect(hdbc)
用上面四个ODBC函数可以断开应用与数据源间的连接,其一般次序是先释放语句句柄,然后是断开与数据源的连接,接下来就可以释放连接句柄和环境句柄,其示意图可见图9.34。
图9.34 ODBC断开示意图
(4)ODBC工作流程全貌
基于上面的三个步骤,ODBC的整个工作流程是一个相当规范的流程,它由连接、处理与断开连接三部分组成,构成一个如下图9.35所示的流程图。
图9.35 ODBC工作流程全貌图
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。