数据库嵌入式链接对象(数据库)
时间:2022-11-18 14:30:01 | 来源:信息时代
时间:2022-11-18 14:30:01 来源:信息时代
数据库嵌入式链接对象 : 一种基于组件(COM)的数据访问接口,用来访问各种数据源,主要由数据源提供商来实现,如Oracle、SQL Server、Access等。
开放式数据库互连(ODBC)的目的是提供一个公用的API,用来访问数据库,而不用考虑数据库的内部细节、语言和表的组织。但是,随着时间的推移,人们发现,面对新的数据驱动应用程序的设计和构造方法,ODBC越来越无法成功地满足需要。为进一步提高数据库API的通用性,微软提出OLE DB标准。
1. OLE DB的结构
OLE DB是作为一种组件技术而设计的,它将传统的数据库系统划分为多个逻辑组件,这些组件之间相对独立又相互通信。这种多层组件模型以COM作为桥梁,在COM桥的一侧是用于保留数据的服务器组件,另一侧是了解如何连接和请求数据的客户端组件。前者称作OLE DB数据提供者(data provider),提供数据存储的软件组件,如普通的文本文件、主机上的复杂数据库、电子邮件等数据的存储软件组件,有的文档把这些软件组件的开发商也称为数据提供者: 后者称作OLE DB数据使用者(data consumer),如使用ActiveX数据对象(ADO)的应用程序或网页等。也就是说,使用者和提供者都是COM对象,并能够通过一套COM接口互相通信。这种基于COM的通信可被概括为在抽象对象(Data Source、Session、Command和Rowset)上执行的操作(使用者连接到DataSource、打开Session、发出Command并返回数据Rowset),能提供对所有类型的数据的访问,包括关系型、非关系型和层次结构性数据,甚至能在离线的情况下存取数据。
除了提供者和使用者,OLE DB模型还包括第三个元素OLE DB服务组件(service component)。服务组件可以执行数据提供者以及数据使用者之间数据传递的工作。数据使用者向数据提供者要求数据时,通过OLE DB服务组件的查询处理器执行查询工作,而查询到的结果则由指针引擎来管理。即服务也是一种COM组件,监督使用者和提供者之间的所有通信,用于处理返回给使用者的“行集”。
OLE DB模型结构如图1所示。
图1 OLE DB模型结构示意图
这一模型可以增强系统的可伸缩性和总体性能。比如,ADO对中间OLE DB服务进行扩展,可以让数据使用者和数据提供者并不总是连接。一旦建立连接,便可以发出指定的查询,获取记录并将其放至内存中的存储库,然后从数据源断开连接。在脱机状态下可以处理这些记录,并在需要时重新连接或提交更改。这种工作方式在.NET下有望进一步得到改善。
与ODBC相比,OLE DB对数据物理结构的依赖更少;此外,它不必严格基于SQL,OLE DB命令可以是SQL语句,也可以是其他的一些东西,可以将它们看作以任何能够为目标提供者理解的语法写成的文本字符串。
OLE DB采用C++的概念进行设计,以尽可能提高中间层模块数据访问的性能。在C++应用程序中使用OLE DB调用,经过的代码层次较少,可以比较直接地到达数据。也正因为如此,OLE DB不能直接在Visual BASIC或ASP中使用。
在开发基于OLE DB的应用程序时,由于直接使用OLE DB的对象和接口开发数据库应用程序需要书写大量的代码,为了简化程序设计,Visual C++提供了ATL模板用于开发OLE DB数据应用程序和数据提供程序。ATL模板分为数据提供程序的模板和数据使用程序的模板。使用ATL模板前先创建应用框架,再加入ATL产生的模板类,然后在应用中使用产生的数据访问对象。
利用ATL模板产生数据使用程序较为简单,但适用性不广,不能动态适应数据库的变化。可以使用MFC OLE DB类直接生成数据使用程序。
2. OLE DB的常用类
(1)会话类:
CDataSource类: CDataSource与OLE DB的数据源对象相对应。这个类代表了OLE DB数据提供程序和数据源之间的连接。只有当数据源的连接被建立之后,才能产生会话对象,可以调用Open()来打开数据源的连接。
CSession类: CSession所创建的对象代表了一个单独的数据库访问的会话。一个用CDataSource类产生的数据源对象可以创建一个或者多个会话,要在数据源对象上产生一个会话对象,需要调用函数Open()来打开。同时,会话对象还可用于创建事务操作。
CEnumeratorAccessor类: CEnumeratorAccessor是用来访问枚举器查询后所产生的行集中可用数据提供程序的信息的访问器,可提供当前可用的数据提供程序和可见的访问器。
(2)访问器类:
CAccessor类:CAccessor代表与访问器的类型。当用户知道数据库的类型和结构时,可以使用此类。它支持对一个行集采用多个访问器,并且,存放数据的缓冲区是由用户分配的。
CDynamicAccessor类: CDynamicAccessor用来在程序运行时动态地创建访问器。当系统运行时,可以动态地从行集中获得列的信息,可根据此信息动态地创建访问器。
CManualAccessor类: CManualAccessor用在程序运行时将列与变量绑定或者是将参数与变量绑定。
(3)行集类:
CRowSet类: CRowSet封装了行集对象和相应的接口,并且提供了一些方法用于查询、设置数据等。可以用Move()等函数进行记录移动,用GetData()函数读取数据,用Insert()、Delete()、SetData()来更新数据。
CBulkRowset类:CBulkRowset用于在一次调用中取回多个行句柄或者对多个行进行操作。
CArrayRowset类: CArrayRowset提供用数组下标进行数据访问。
在打开数据源,建立会话和行集对象后就可以获取数据和数据类型了。所获取的数据类型取决于所用的存取程序,可能需要绑定列。
(4)命令类:
CTable类: CTable用于对数据库的简单访问,用数据源的名称得到行集,从而得到数据。
CCommand类: CCommand用于支持命令的数据源。可以用Open()函数来执行SQL命令,也可以Prepare()函数先对命令进行准备,对于支持命令的数据源,可以提高程序的灵活性和健壮性。