关系数据库接口技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4.6关系数据库接口技术
基于关系型数据库管理系统(Oracle,SQL,Server等)管理空间数据大部分采用Binary 二进制块的字段存储变长记录。

目前大部分关系数据库管理系统都提供了Binary二进制块的字段域,以适应管理多媒体数据或可变长文本字符。

关系数据库接口技术主要解决数据库管理者或应用程序与数据库的数据交换问题。

4.6.1开放式数据库互连ODBC
ODBC:开放式数据库互连(Open Database Connectivity),是微软公司推出的一种实现应用程序和关系数据库之间通讯的方法标准,是一个接口标准。

所以它实际上是一种标准,符合标准的数据库就可以通过SQL语言编写的命令对数据库进行操作,但只能针对关系数据库进行操作(如SQL Server,Oracle,Access,Excel等),目前所有的关系数据库都符合该标准。

ODBC本质上是一组数据库访问API(应用程序编程接口),由一组函数调用组成,核心是SQL语句。

一个基于ODBC的应用程序对数据库进行操作时,用户直接将SQL语句传送给ODBC,同时ODBC对数据库的操作也不依赖任何DBMS,不直接与DBMS打交道,它将所有的数据库操作由对应的DBMS的ODBC驱动程序完成,由对应DBMS的ODBC驱动程序对DBMS进行操作。

也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBC API进行访问。

由此可见,ODBC的最大优点是能以统一的方式处理所有的关系数据库。

在具体操作时,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。

这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。

不过直接使用ODBC API比较麻烦,所以微软后来又发展出来DAO、RDO、ADO这些数据库接口,使用这些数据库接口开发程序更容易。

这些接口都支持ODBC,所以即使你所访问的数据库没有提供ADO的驱动,只要有ODBC驱动一样可以使用ADO进行访问。

但ODBC 实际上是一种相当底层的访问技术,因此它可以从底层设置和控制数据库,完成一些高级数据库技术无法完成的功能。

4.6.2数据库访问对象DAO
DAO:数据库访问对象(Database Access Object),所谓数据访问对象,顾名思义就是与数据库打交道,夹在业务逻辑层与数据资源层之间。

是Microsoft一种用来访问Jet引擎的方法,主要适用于单系统应用程序或在小范围本地分布使用,访问所谓桌面数据库(如Access、FoxPro、dBase等)。

DAO在设计时是专门用来处理MDB数据库的,由于其内部已经对Jet 数据库的访问进行了加速优化,因此访问Access数据库时性能很好,也很方便,所以如果数据库是Access数据库且是本地使用的话,建议使用这种访问方式。

它也可以通过ODBC 访问远程数据库,但效率较低,一般不采用这种方式。

它是第一个面向对象的数据库访问接口。

DAO可以访问非关系型数据库。

4.6.3远程数据库对象RDO
RDO:远程数据库对象(Remote Database Object)。

为了弥补DAO访问远程数据库能力的不足,微软推出了RDO数据库访问接口,可以方便的用来访问远程数据库(网络数据库)。

它封装了ODBC API的对象层,因此在访问ODBC兼容数据库时,具有比DAO更高的性能,而且比ODBC更易用。

但同样由于这种和ODBC紧密的结合,使得它只能以ODBC的方式访问关系型数据库,同时也在访问Jet或ISAM数据库方面受到限制,而且无法访问非关系型数据库(?)。

RDO提供了访问存储过程和复杂结果集的更多和更复杂的对象、属性以及方法,但它只是从DAO向ADO迈进的一个过度产品,在大多数情况下,ADO的性能都要优于
它。

4.6.4数据库链接和嵌入对象OLE DB
OLE DB:数据库链接和嵌入对象(Object Linking and Embedding DataBase)。

OLE DB是微软提出的基于COM思想且面向对象的一种技术标准,目的是提供一种统一的数据访问接口访问各种数据源,这里所说的"数据"除了标准的关系型数据库中的数据之外,还包括邮件数据、Web上的文本或图形、目录服务(Directory Services)、以及主机系统中的文件和地理数据以及自定义业务对象等。

OLE DB标准的核心内容就是要求对以上这些各种各样的数据存储(Data Store)都提供一种相同的访问接口,使得数据的使用者(应用程序)可以使用同样的方法访问各种数据,而不用考虑数据的具体存储地点、格式或类型。

OLE DB 标准的具体实现是通过一组C++ API 函数,就像ODBC 标准中的ODBC API 一样,不同之处只是在于OLE DB 的API 是符合COM 标准、基于对象的。

由于OLE DB可以访问各种类型的数据源,包括关系型数据库,所以说,符合ODBC 标准的数据源是符合OLE DB标准的数据源的子集。

但是符合ODBC的数据源要能够被OLE DB访问,符合OLE DB标准,还必须提供相应的OLE DB服务提供程序,就像SQL Server要符合ODBC标准,必须提供SQL Server ODBC驱动程序一样。

实际上,微软已经为所有的ODBC数据源提供了一个统一的OLE DB服务程序,叫做Microsoft OLE DB Provider for ODBC drivers。

这个东西允许你通过OLE-DB或ADO 访问ODBC提供的所有功能。

换言之,ODBC和OLEDB这两种技术是互补的,不能完全互相替换。

但在访问SQL Server数据库时,不通过ODBC驱动,而是通过一个专门的OLE DB Provider for SQL Server直接调用,具体参见图7(?)。

对于非关系型数据源,只要它提供相应的OLE DB访问接口,就可以同其他关系型数据源一样进行操作。

ODBC OLE DB Provider发布之后,有人又担心ODBC Provider是不是在ODBC之上的新的层次?如果是,那么使用OLE DB访问ODBC数据源是否将影响性能?答案也是否定的。

实际上,ODBC Provider的作用是替换ODBC Driver Manager,作为应用程序与ODBC驱动程序之间的桥梁,理论上不会增加任何开销。

具体参见图1所示。

4.6.5 ActiveX数据对象ADO
ADO:(ActiveX Data Object)ActiveX数据对象。

ADO是微软于1996年冬推出的一种面向对象的、基于COM思想的数据库访问接口。

由于OLE DB标准的API是C++ API,只能供C++语言调用(这也是OLEDB没有改名为ActiveX DB的原因,ActiveX是与语言无关的组件技术)。

为了使流行的各种编程语言都可以编写符合OLE DB标准的应用程序,微软在OLE DB API之上,提供了一种面向对象、与语言无关的应用编程接口,这就是ActiveX Data Objects,简称ADO。

实质上,ADO就是将OLE DB的面向C++的复杂接口封装起来,提供了便于操作的接口。

还可以说ADO其实只是一个应用程序层次的界面,它用OLE DB来与数据库通信,ADO为OLEDB 提供高层应用API函数。

ADO是DAO和RDO的后继产品,它扩展了DAO和RDO所使用的对象模型,因为它包含更少的对象,更多的属性、方法(和参数)以及事件。

微软是打算用它来代替DAO和RDO的,但实际上AOD 2.0与RDO更为相似,并不包含DAO的所有功能。

在使用上一般
具有以下两种层次关系:应用程序-> ADO -> OLE DB -> ODBC -> 数据源或者应
用程序-> ADO -> OLE DB -> 数据源。

4.6.6JDBC
JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口(API),制定了统一的访问各种关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现。

这东西能够实现软件的扩平台性。

JDBC是一种底层API,在访问数据库是需要在业务逻辑中直接嵌入SQL语句。

JDBC不能够直接访问数据库,必须依赖数据库厂商提供的JDBC驱动程序完成以下三步工作
<1>同数据库建立连接;<2>向数据库发送SQL语句;<3>处理从数据库返回的结果。

1.JDBC驱动
1)JDBC-ODBC桥连是指通过本地的OBDC Driver连接到RDBMS上。

2)JDBC-Native桥连通过调用本地的native程序实现数据库连接,这种类型的驱动程序把客户机API上的JDBC调用转为Oracle,Sybase,Informix,DB2或者其它DBMS的调用。

3)JDBC网络驱动是一种完全利用Java语言编写的JDBC驱动。

4)本地协议驱动是一种完全利用Java语言编写的JDBC驱动,这种类型的驱动程序将JDBC 调用直接转换为DBMS所使用的网络协议。

2.JDBC中常用接口
1)Driver接口
每种数据库的驱动程序都应该提供一个实现java.sql.Driver接口的类,简称Driver类。

加载JDBC-ODBC驱动:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
2)DriverManager类
java.sql.DriverManager类负责管理JDBC驱动程序的基本服务,是JDBC的管理层,作用于用户和驱动程序之间,负责跟踪可用的驱动程序,并在数据和驱动程序之间建立连接。

(静态方法)getConnection(String url,String user,String password)用来建立数据库连接。

setLoginTimeout(int seconds)用来设置每次连接数据库的最长时间
println(String message)用来输出指定消息到当前的JDBC日记流
3)Connection接口
java.sql.Connection接口代表与特定数据库的连接,在接连的上下文中可以执行SQL语句并返回结果,还可以通过getMetaData()方法获得由数据库提供的相关信息。

createStatement()创建并返回一个Statement 实例,通常在执行无参数的SQL语句是创建实例。

4)Statement接口
java.sql.Statement接口用来执行静态SQL语句,并返回执行结果。

对于INSERT,IPDATE和DELETE语句,调用executeUpdate(String sql)方法;对于SELECT语句,则调用executeQuery(String sql)方法,并返回一个永远不能为null的ResultSet实例。

5)PreparedStatement接口
java.sql.PreparedStatement接口继承并扩展了Statement接口,用来执行动态的SQL语句,即包含参数的SQL语句。

通过setXxx()方法为SQL语句中的参数赋值时,建议利用与参数类型匹配的方法,也可以利用setObject()为各种类型赋值。

PreparedStetement ps=connection.preparedStatement("select * from table_name where id>? and (name=? or name=?)");
ps.setInt(1,6);
ps.setString(2,"马先生");
ps.setObject(3,"李先生");
ResultSet rs=ps.executeQuery();
clearParameters()清除当前参数的值。

-CallableStatement接口
java.sql.CallableStatement接口继承并扩展PreparedStatement接口,用来执行SQL的存储过程。

6)ResultSet接口
java.sql.ResultSet接口类似于一个数据表,通过该接口的实例可以获得检索结果集,以及对应数据表的相关信息,ResultSet实例通过执行查询数据库的语句生成。

next()方法可以将指针移动到下一行,返回bool类型。

只能迭代一次!
getXxx()方法均有两个重载方法,分别根据列的索引号和列的名称检索列值。

first(),返回bool值
last(),返回bool值
previous()将指针移动到上一行,返回bool值
beforeFirst()
afterLast()
absolute()移动到指定行,int>0向下移动,int<0,向后移动
relative()相对当前位置移动到指定行,int>0向下移动,int<0,向后移动
getRow()当前行索引编号
findColumn()查看指定列名的索引编号
isBeforeFirst()查看指针是否处于实例开头,返回bool
isFirst()查看指针是否处于第一行,返回bool
deleteRow()删除当前行,执行该方法后,在执行close()之后才会同步到数据库
4.6.7数据库访问接口的发展历程
早期的程序员在程序中要连接数据库是非常困难的,每种DBMS产生的数据库文件的格式都不一样,程序员要对他们访问的DBMS的底层API有相当程度的了解,通过API来访问特定的DBMS。

这就产生了一个问题,当使用的DBMS改变后,或者用户习惯使用的DBMS 与开发程序使用DBMS的不符合时,应用软件便无法正常访问DBMS。

因此,能处理各种数据文件的API便产生了,这就是大家都知道的ODBC。

ODBC是通用API的早期产物,是基于结构查询语言(sql) 的,以此作为访问数据的标准。

这时大多数DBMS提供了面向ODBC的驱动程序,遵从了这个标准的DBMS被称为ODBC兼容的DBMS。

ODBC兼容的数据库包括Access, MS-SQL Server, Oracle, Informix等。

但是ODBC并不完美,他虽然统一了对多种常用DBMS的访问,但是这个“访问”的过程是非常困难的,他仍然存在大量的低级调用,程序员必须将大量的精力放在底层的数据通信中,而不能专注于所要处理的数据。

为了改善这种极其不友好的接口,使得在程序开发中,数据库访问的工作更加容易,微软提出里一个解决方案:DAO (Data Access Objects),DAO的代码看起来是这样的:
objItem.AddNew
= "StudentDB"
objItem.Price = 10
objItem.Update
这说明他的代码更易于掌握,因为它更像是一种面向对象的语言,建立想要使用对象后,
可以给他的各种属性赋值,提取各种属性的值,或者使用该对象提供的方法。

总之,DAO是第一个面向对象的接口。

DAO最适用于单系统应用程序或小范围本地分布使用。

于是为了访问远程DBMS,更好地实现数据共享,或数据的交互操作,比如想要联接查询位于不同地方的主机中的两个数据表,这时产生了一个新的数据库访问接口:RDO(Remote Data Objects),远程数据对象。

当然,RDO也是一个面向对象的接口。

它同易于使用的 DAO style组合在一起,形式上展示出所有 ODBC 的底层功能和灵活性。

RDO已被证明是许多 SQL Server、Oracle 以及其他大型关系数据库开发者经常选用的最佳接口。

RDO 提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。

但是随着需求的发展,又引出了新的问题。

ODBC和RDO数据库接口都需要数据以SQL(Structured Query Language)的格式存储,或者说,要求访问的数据文件都必须是关系类型的,也就是说产生这些文件的DBMS必须是关系数据库。

而在平时,我们经常要处理一些非关系数据源,例如Excel电子表格,有规则或无规则的文本文件,XML文件等。

针对这个问题,微软提出了OLEDB,一个基于COM标准的数据存取对象。

他能提供对所有数据类型的操作,甚至是没有规则的文本文件。

可能是由于两个原因,产生了ADO----微软最新的数据库接口。

这两个原因是:1,为了大幅减少数据库访问工作量,提供一个更易于操作,更友好的接口。

因为ADO是基于OLEDB 的技术,他将OLEDB的功能封装,对用户透明。

2,为了整合各种功能于一身,因为ADO 是DAO和RDO的后继产物。

包含在DAO 和RDO 模型中的许多功能被合并为单个对象,这样就生成了一个简单得多的对象模型。

ADO “扩展”了DAO 和RDO 所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。

另外还有一种数据访问接口。

它与ADO的数据访问方式在思想上是没有继承关系的,ADO是基于COM思想,而是基于.NET框架体系,主要用于基于WEB的应用程序,善于处理XML类型的数据。

由以上论述可以看出:ODBC和OLEDB是底层的数据库接口,他们通过驱动程序访问数据文件,而DAO,RDO,ADO是上层数据库接口,他们向上与应用程序交互,向下与ODBC 或OLEDB对话。

另外,DAO也可以通过JET引擎访问数据文件。

ADO是对OLEDB的封装。

4.6.8常见数据库访问接口的比较
1 ODBC与DAO
ODBC类只支持DML(Data Manipulation Language,数据操作语言),不支持DDL,所以用ODBC类只能完成数据的操作,不能涉及数据库的结构。

支持DDL是DAO对数据库编程良好支持的一个重要体现。

DDL(Data Definition Language)在SQL术语中叫做"数据定义语言",它用来完成生成、修改和删除数据库结构的操作。

只要有ODBC驱动程序,DAO就可以访问ODBC数据源。

二者都支持对各种ODBC数据源的访问。

虽然二者使用的数据引擎不同,但都可以满足用户编写独立于DBMS的应用程序的要求。

另外,DAO可以用Jet引擎访问两类数据库而无需通过ODBC驱动,一是*.MDB数据库,Microsoft Access 就是这类数据库,由于DAO是基于Microsoft Jet引擎的,因而在访问Access数据库(即*.MDB文件)时具有很好的性能。

二是ISAM数据库,包括Btrieve、dBASEIII、dBASEIV、Microsoft FoxPro。

但DAO是针对VB/Access设计的,它所支持的数据库类型就是VB的那几种,很少见第三方驱动程序。

ODBC是开放的数据库接口,几乎支持所有数据库类型,对于很多VB不能很好地支持的数据库类型,如Visual FoxPro 5.0,都可以使用ODBC驱动。

一般来说DAO支持本机Access数据库比较理想,但在客户/服务器体系上不如ODBC功能强大。

2 DAO、RDO与ADO
ADO在编程难易程度方面比DAO和RDO都好(主要得益于简单的对象模型),但是在利用数据库的特性方面与RDO不相上下,但是ADO新版本的性能会比RDO更强。

与DAO,RDO模型的层次结构不同,ADO 基本上是一种平板结构:Command 和Recordset 与Connection 之间并没有上下层次关系。

换一种说法,DAO或RDO在定义Recordset对象时,必须先定义Connection对象,而ADO则可以不通过Connection而直接定义Recordset对象。

ADO是DAO和RDO的后继产物,但是ADO目前还没有包含DAO的所有功能,目前的ADO 并不支持数据定义语言(DDL),而我们已经知道DAO是支持DDL的。

最终Microsoft承诺将提供一个ADO DDL 部件来帮助进行DAO到ADO的移植,并为OLE DB供应商提供一般的DDL 支持。

微软已公开表示,今后的微软产品数据访问的接口方面,将统一到OLE DB和ADO 标准上来。

3 ADO与
ADO使用OLE DB接口并基于微软的COM技术,而拥有自己的接口并且基于微软的.NET体系架构。

这也就是说和ADO的数据访问方式是不同的。

在ADO 中,数据的内存中表示形式为记录集Recordset,而在 中,数据在内存中的形式为数据集Dataset。

记录集看起来像单个表,如果要获得几个表的相关数据,必须使用JOIN 查询。

相反,数据集是一个或多个表的集合。

这样,数据集可以模仿基础数据库的结构。

ADO 的运作是一种在线方式,他对数据的操作必须是实时的。

则使用离线方式,在访问数据的时候会利用XML制作数据的一份幅本,的数据库连接也只有在这段时间需要在线。

优点是效率高,在Web上,有上千个并行用户,系统资源是非常昂贵的。

图常用数据库访问接口比较图。

相关文档
最新文档