第7章 数据库系统的访问
对于那些相对独立的软件供应商而言,经常要为每一个DBMS编写一个版本的应用程序,或者为每个要访问的DBMS编写针对DBMS的代码。这就意味着,大量的资源都耗在了编写和维护DB的访问上,更不用说应用程序了。此时应用程序的评价标准不再是质量,而是它能否在给定的DBMS中访问数据库。
这就需要开放的数据库连接,就是人们需要用一种新的方法来访问不同的数据库。为此,在C/S,B/S系统中必须广泛使用访问接口技术,以隐藏各种复杂性,屏蔽各种系统之间的差异。常见的数据库访问接口的技术有固有调用、ODBC、JDBC、OLE DB、DAO、ADO、ADO.NET以及基于XML的数据库访问等几种流行的方式。这其中以ODBC技术和JDBC技术应用最广泛,也是目前最为优秀的访问接口方式。
本章主要对几种常见的数据库访问技术(如固有调用、ODBC、JDBC、OLE DB、DAO、ADO、ADO.NET以及基于XML的数据库访问等)进行介绍。
7.1 数据库的访问接口
所谓访问接口是指分布式环境中保证操作系统、通信协议、数据库等之间进行对话、互操作的软件系统。
访问接口的作用是保证网络中各部件(软件和硬件)之间透明地连接,即隐藏网络部件的异构性,尤其保证不同网络、不同DBMS和某些访问语言的透明性,即下面三个透明性。
网络透明性:能支持所有类型的网络。
服务器透明性:不管服务器上的DBMS是何种型号(ORACLE、SYBASE、DB2等),一个好的访问接口都能通过标准的SQL语言与不同DBMS上的SQL语言连接起来。
语言透明性:客户机可用任何开发语言进行发送请求和接受回答,被调用的功能应该像语言那样也是独立的。
应用系统访问数据库的接口方式有多种,本节介绍固有调用、ODBC和JDBC。
7.1.1 固有调用
每个数据库引擎都带有自己的包含用于访问数据库的APl函数的动态链接库DLL,应用程序可
利用它存取和操纵数据库中的数据。如果应用程序直接调用这些动态链接库,就说它执行的是“固有调用”,因为该调用对于特定的数据库产品来说是“固有” (专用)的。
固有调用接口的优点是执行效率高,由于是“固有”,编程实现较简单。但它的缺点也是很严重的:不具通用性。对于不同的数据库引擎,应用程序必须连接和调用不同的专用的动态链接库,这对于网络数据库系统的应用是极不方便的。
7.1.2 ODBC
ODBC是“开放数据库互连”(Open Database Connectivity)的简称。ODBC是Microsoft公司提出的、当前被业界广泛接受的应用程序通用编程接口(API)标准,它以X/Open和 ISO/IEC的调用级接口(CLI)规范为基础,用于对数据库的访问。我们可以用如下图示来说明ODBC概念。
图7-1 ODBC概念图
ODBC实际上是一个数据库访问函数库,使应用程序可以直接操纵数据库中的数据。ODBC是基于SQL语言的,是一种在SQL和应用界面之间的标准接口,它解决了嵌入式SQL接口非规范核心,免除了应用软件随数据库的改变而改变的麻烦。ODBC的一个最显著的优点是,用它生成的程序是与数据库或数据库引擎无关的,为数据库用户和开发人员屏蔽了异构环境的复杂性,提供了数据库访问的统一接口,为应用程序实现与平台的无关性和可移植性提供了基础,因而ODBC获得了广泛的支持和应用。
1. ODBC结构
ODBC结构由四个主要成分构成:应用程序、驱动程序管理器、驱动程序、数据源。其构成及体系结构说明如下:
应用程序 执行处理并调用ODBC API函数,以提交 SQL语句并检索结果。
驱动程序管理器(Driver Manager) 根据应用程序需要加载/卸载驱动程序,处理ODBC函数调用,或把它们传送到驱动程序。
驱动程序 处理ODBC函数调用,提交SQL请求到一个指定的数据源,并把结果返回到应用程序。如果有必要,驱动程序修改一个应用程序请求,以使请求与相关的DBMS支持的语法一致。
数据源 包括用户要访问的数据及其相关的操作系统、DBMS及用于访问DBMS的网络平台。
其体系结构图如下:
图7-2 ODBC的体系结构图
为达到通用的效果,ODBC在应用程序和特定的数据库之间插入了一个ODBC驱动程序管理器(ODBC Driver Manager)。驱动程序管理器为应用程序加载或卸载驱动程序,负责管理应用程序中ODBC函数在DLL中函数的绑定(Binding),它还处理几个初始化ODBC调用,提供ODBC函数的入口点,进行ODBC调用的参数合法性检查等。
每种数据库引擎都需要向ODBC驱动程序管理器注册它自己的ODBC驱动程序,这种驱动程序对于不同的数据库引擎是不同的。ODBC驱动程序管理器能将与ODBC兼容的SQL请求从应用程序传给这种独一无二的驱动程序,随后由驱动程序把对数据库的操作请求翻译成相应数据库引擎所提供的固有调用,对数据库实现访问操作。
ODBC通过驱动程序来提供数据库独立性。驱动程序是一个用于支持ODBC函数调用的模块(通常是一个动态链接库DLL),应用程序调用驱动程序所支持的函数来操纵数据库。
若想使应用程序操作不同类型的数据库,就要动态链接到不同的驱动程序上。ODBC驱动程序处理ODBC函数调用,将应用程序的SQL请求提交给指定的数据源,接受由数据源返回的结果,传回给应用程序。
ODBC的API一致性级别分为三级:核心级、扩展1级和扩展2级。核心级包括最基本的功能,包括分配、释放环境句柄、数据库连接、执行SQL语句等,核心级函数能满足最基本的应用程序要求。扩展1级在核心级的基础上增加了一些函数,通过它们可以在应用程序中动态地了解表的模式,可用的概念模型类型及它们的名称等。扩展2级在扩展1级的基础上又增加了一些函数。通过它们可以了解到关于主关键字和外来关键字的信息、表和列的权限信息、数据库中的存储过程信息等,并且还有更强的游标和并发控制功能。
2. ODBC接口函数按功能
分配和释放内存。这组函数用于分配必要的句柄:连接句柄、环境句柄和语句句柄。
连接句柄定义一个数据库环境,环境句柄定义一个数据库连接,语句句柄定义一条SQL语句。执行分配函数时首先分配内存,然后定义所需的数据结构,并对指向数据结构的句柄赋值。一但句柄已经分配,应用系统便可以把它传递给后续的接口函数,指出该函数所作用的环境、连接或语句。
连接。在应用系统的流程控制中,一旦环境(包括其句柄)已经分配,便可以建立二个或者多个连接句柄;同样地,语句句柄也是如此。有了用于连接的函数,用户便能与服务器建立自己的连接。但在退出应用系统时,应关闭与服务器的连接。
执行SQL语句。指定和执行SQL语句的方法有两种:准备的和直接的。如果想让应用系统多次提交sQL语句并且可能修改参数值,便使用准备的执行;如果只让应用系统提交一次SQL请求,便使用直接的执行。
接收结果。这组函数负责处理从SQL语句结果集合中检索数据,并且检索与结果集合相关的信息。例如,描述结果集合中的一列以及属性,取出结果集合的下一行,计算一条SQL语句所影响的行数等。任何一个函数都可以在派生表或结果集合中使用光标,指出它当前在结果集合中的哪一行。
事务控制。这组函数允许提交或者重新运行事务。尽管ODBC的缺省模式是“自动提交”,这时每一条SQL语句都是一个完整的事务,但是也可以设置一个连接选项,从而允许使用“人工提交”模式。这种“人工提交”模式允许事务一直打开,直至应用系统提交。
错误处理和其他事项。该组函数用于返回与句柄相关的错误信息。另一个函数允许人们取消一条SQL语句。
ODBC的基本流程控制是:初始化SQL处理终止。在初始化阶段分配环境,包括分配环境句柄、连接句柄和语句句柄,与服务器连接;在SQL处理阶段执行SQL语句和检索操作;在终止阶段释放语句句柄、环境句柄、连接句柄,与服务器断开。如图7-3所示。
3. 数据源的连接与断开
连接数据源的函数
连接数据源的函数有三个,但最有效、最通用的是下面一种格式:SQLConnect(hdbc,szDSN,cbDSN,szUID,cbUID,szAuthStr,cbAuthStr)。其中,参数hdbc是一个已经分配的连接分配;参数szDSN和cbDSN分别表示系统所要连接的数据源名称及其长度;参数szUID和cbUID分别表示用户标识符及其长度;参数szAuthStr和cbAuthStr分别表示权限字符串及其长度。
断开数据源函数
其格式如下:SQL Disconnect(hdbc)其中,参数hdbc是要断开的连接句柄。
图7-3 ODBC的基本流程控制图
具体用SQL语句来执行实现数据源的连接与断开代码片段如下
SQL语句的执行:
main()
{
ASD asd; /*说明asd是一个环境型变量*/
LZJ lzj; /*说明lzj是一个连接型变量*/
JDK jdk; /*说明jdk是一个语句句柄变量*/
RETCODE retcode; /*说明retcode是一个返回变量*/
SQLAllocEnv(& asd); /*分配一个环境句柄*/
SQLAllocConnect(asd,&lzj); /*分配一个连接句柄*/
SQLConnect(lzj,"学生",SQL_NTS,NULL,0,NULL,0);/*连接数据源*/
SQLAllocStmt(lzj,& jdk); /*分配一个语句句柄*/
retcode=SQLExecDirect(jdk,"SELECT * FROM S",SQL_NTS);/*执行语句*/
…… /*结果集处理*/
SQLDisconnect(lzj); /*断开数据源*/
SQLFreeStmt(jdk,SQL_DROP) /*释放一个语句句柄*/
SQLFreeConnect(lzj); /*释放一个连接句柄*/
SQLFreeEnv(asd); /*当应用完成后,释放环境句柄*/
}
4. 有准备地执行SQL语句的函数:
SQL语句预备函数
其格式如下:SQLPrepare(jdk,szSqlStr,cbSqlStr)。其中,参数hstmt是一个有效的语句句柄,参数szSqlStr和cbSqlStr分别表示将要执行的SQL语句的字符串及其长度。
SQL语句执行函数
其格式如下:SQLExecute(jdk)。其中参数jdk是一个有效的语句句柄。
SQL语句查询结果的获取:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论