OLE全称Object Link and embed,即对象连接与嵌入。
作为微软的组件对象模型(COM)的一种设计,OLE DB是一组读写数据的方法(在过去可能被称为渠道)。OLE DB中的对象主要包括数据源对象、阶段对象、命令对象和行组对象。使用OLE DB的应用程序会用到如下的请求序列:初始化OLE 连接到数据源、发出命令、处理结果、释放数据源对象并停止初始化OLE Object Linking and Embedding,对象连接与嵌入,简称OLE技术。OLE不仅是桌面应用程序集成,而且还定义和实现了一种允许应用程序作为软件“对象”(数据集合和操作数据的函数)彼此进行“连接”的机制,这种连接机制和协议称为部件对象模型。
OLE是一种面向对象的技术,利用这种技术可开发可重复使用的软件组件(COM)。
DB(英文全称data base,数据库)是依照某种数据模型组织起来并存放二级存储器中的数据集合。
OLE DB最主要是由三个部分组合而成:
Data Providers数据提供者
凡是透过OLE DB将数据提供出来的,就是数据提供者。例如SQL Server数据库中的数据表,或是附文件名为mdb的Access数据库档案等,都是Data Provider。
Data Consumers数据使用者
凡是使用OLE DB提供数据的程序或组件,都是OLE DB 的数据使用者。换句话说,凡是使用ADO 的应用程序或网页都是OLE DB的数据使用者。
Service Components服务组件
数据服务组件可以执行数据提供者以及数据使用者之间数据传递的工作,数据使用者要向数据提供者要求数据时,是透过OLE DB服务组件的查询处理器执行查询的工作,而查询到的结果则由指针引擎来管理。
OLE DB将传统的数据库系统划分为多个逻辑组件,这些组件之间相对独立又相互通信。这种组件模型中的各个部分被冠以不同的名称:
数据提供者
(Data Provider)。提供数据存储的软件组件,小到普通的文本文件、大到主机上的复杂数据库,或者电子邮件存储,都是数据提供者的例子。有的文档把这些软件组件的开发商也称为数据提供者。
数据服务提供者
(Data Service Provider)。位于数据提供者之上、从过去的数据库管理系统中分离出来、独立运行的功能组件,例如查询处理器和游标引擎(Cursor Engine),这些组件使得数据提供者提供的数据以表状数据(Tabular Data)的形式向外表示(不管真实的物理数据是如何组织和存储的),并实现数据的查询和修改功能。SQL Server 7.0 的查询处理程序就是这种组件的典型例子。
业务组件(Business Component)。利用数据服务提供者、专门完成某种特定业务信息处理、可以重用的功能组件。分布式数据库应用系统中的中间层(Middle-Tier)就是这种组件的典型例子。
数据消费者(Data Consumer)。任何需要访问数据的系统程序或应用程序,除了典型的数据库应用程序之外,还包括需要访问各种数据源的开发工具或语言。
开始编写OLE DB应用程序之前应考虑以下问题:
使用何种编程实现来编写OLE DB应用程序?
Microsoft提供多种库来解决该问题:OLE DB模板库、OLE DB属性以及OLE DB SDK中的原始OLE DB接口。另外,Microsoft还提供帮助您编写程序的向导。有关这些实现的更详细的信息,请参见OLE DB模板、属性和其他实现。
是否需要编写自己的提供程序?
大多数开发人员无需这样。Microsoft提供多种提供程序。无论用户何时创建一个数据连接,例如,当使用ATL OLE DB使用者向导向项目中添加使用者时,“数据链接属性”对话框都将列出系统中所有被注册的可用提供程序。如果其中一个提供程序适合于用户自己的数据存储和数据访问应用程序,最简单的办法就是使用该提供程序。但是,如果用户的数据存储不适合所提供的类别,则必须创建自己的提供程序。有关创建提供程序的信息,请参见OLE DB提供程序模板及其子主题。
需要为自己的使用者提供何种级别的支持?
一些使用者可能非常简单,另一些可能非常复杂。OLE DB对象的功能由属性指定。使用ATL OLE DB使用者向导创建使用者或者使用数据库提供程序向导创建提供程序时,向导将为用户设置合适的对象属性来提供一组标准功能。但是,如果向导生成的使用者类或提供程序类并不具有您需要的所有支持功能,那么您需要查阅这些类在OLE DB模板库中的接口。这些接口包装原始OLE DB接口,提供附加实现以使其使用起来更加简单。
例如,如果您希望更新行集合中的数据,但在使用向导创建使用者时却忘记指定该功能,则可以在创建使用者之后通过对命令对象设置DBPROP_IRowsetChange和DBPROP_UPDATABILITY属性来指定该功能。这样,当行集合创建之后,它将具有IRowsetChange接口。
您是否有使用其他数据访问技术(ADO、ODBC或DAO)的旧版代码?
由于可能有各样各样的技术组合(例如ADO组件和OLE DB组件一起使用、将ODBC代码迁移至OLE DB等等),所以Visual C++文档不能涵盖所有的情形。
OLE DB与ODBC的关系
由于OLE DB和ODBC标准都是为了提供统一的访问数据接口,所以曾经有人疑惑:OLE DB是不是替代ODBC的新标准?答案是否定的。实际上,ODBC标准的对象是基于SQL的数据源(SQL-Based Data Source),而OLE DB的对象则是范围更为广泛的任何数据存储。从这个意义上说,符合ODBC标准的数据源是符合OLE DB标准的数据存储的子集。符合ODBC标准的数据源要符合OLE DB标准,还必须提供相应的OLE DB服务程序(Service Provider),就像SQL Server要符合ODBC标准,必须提供SQL Server ODBC驱动程序一样。现在,微软自己已经为所有的ODBC数据源提供了一个统一的OLE DB服务程序,叫做ODBC OLE DB Provider。
ODBC OLE DB Provider发布之后,有人又担心:ODBC Provider是不是在ODBC之上的新的层次(Layer)?如果是,那么使用OLE DB访问ODBC数据源是否将影响性能?答案也是否定的。实际上,ODBC Provider的作用,是替换ODBC Driver Manager,作为应用程序与ODBC驱动程序之间的桥梁,理论上不会增加任何开销。