3.利用ODBC技术实现多源以异构数据库的集成
ODBC是Microsoft公司提供的标准的应用程序接口。利用它可以实现一个应用程序访问不同的数据源。ODBC数据源驱动是实现ODBC驱动来访问一个特定的数据源。ODBC屏蔽了底层数据库系统的不同,数据开发者可以直接利用sql语句实现对不同数据库中数据的操纵。
3.1 ODBC技术概述
ODBC是为客户应用程序访问关系数据库时提供的一个标准接口,对不同的数据库,
ODBC提供了一套统一的API,使得应用程序可以应用所提供的API,访问任何提供了ODBC驱动程序的数据库。它使用结构化查询语言(SQL)作为其数据库访问语言。ODBC通过使用数据库驱动程序(Driver)来提供数据库的独立性。驱动程序是用以支持ODBC函数调用的模块(通常是一个DLL),ODBC通过调用驱动程序所支持的函数来对数据库进行操作。
在Visual C++开发环境中,大部分的ODBC功能都被封装到两个类中,即Cdatabase类和CRecordset类,另外还有一个CRecordView类。Cdatabase类包含有数据库的连接信息,提供了对数据源的连接,可以在整个应用程序中共享这些信息。CRecordset类封装了一组数据库记录,通常用于两种形式:动态行集(dynasets)和快照集(snapshots)。CRecordset类允许指定要运行的SQL查询,它还将运行查询并维护自数据库返回的记录集,且所做的更改可反馈给数据库。CRecordView类能以控制的形式显示数据库记录。这个视图是直接连到一个CRecordset类对象的表视图。
3.2 实现多源异构数据库的访问技术的必要性
一般情况下,使用ODBC进行单一数据源的连接是比较方便的,本文主要讨论如何利用ODBC技术实现多源数据库的访问技术。
目前市场上流行的各种数据库管理系统(DBMS)相互之间存在着很大的不同。这些DBMS 采用不同的数据存储格式存取数据,采用不同的管理方法管理数据,并且拥有各自的用户群。尽管关系数据库(RDB)理论与结构化查询语言(SQL)的出现初步统一了各个RDBMS的基本操作,但是如何同时对存储在多个不同DBMS下的数据进行操作,如何以最小的代价集成原有DBMS上的数据等异构型数据库互联问题仍然是数据库技术研究的一个重要课题。
目前对异构型数据库互联有三种成熟的策略:公共编程界面、公共数据网关和公共协议。从各种数据库产品所提供的异种数据集成的机制来看,数据网关和公共编程界面是当今集成异种数据库的主要方法。但这种异种数据库的集成通常都是单向的、主从式的,一种产品一般只提供从自己的DBMS访问异种数据库的机制和产品。到目前为止,一直没有一种通用的数据库互联工具来简化人们的数据库互联工作。因此,我们希望通过研究,能提供一种通用的数据库互联工具,解决互联系统中的一些实际问题。
实现异构数据库的集成,首先要对加入的数据库资源实现完全透明的访问,既要保证全局数据的共享,又要保证各数据库管理系统的自治,确保基于异种系统平台实现对异构数据库的查询和联合使用,提供一个独立于特定的数据库管理系统的统一编程界面。
3.3 数据源的连接
在Visual C++程序中使用建立的数据源之前,必须建立一个到数据源的连接。在MFC中到数据源的连接封装于Cdatabase类中。在同一个程序中可以使用多个数据源,或者多个连接对应同一个数据源。
(1)连接一个已经配置好的数据源可用以下方法:
CDatabase m_database; If(!m_database.IsOpen()) { If(!m_database.IsOpen(_T(“Test”))) Assert(“不能打开该数据源”); } m_database.Close(); |
更为完整的代码表述如下:
CDatabase *pDb=new CDatabase; BOOL bStatus=FALSE; PDb->SetLoginTimeout(3); try { bStatus=pDB->OpenEx(“Test”); if(bStatus) TRACE(“\n DB opened successfully.\n”); Else TRACE(“\n Open DSN failed.\n”); } catch(CmemoryException *pEx) //处理内存异常 { pEx->ReportError(); } catch(CDBExpception *pDBEx) //处理数据库异常 { pDBEx->ReportError(); TRACE(“RetCode:%d strError[%s] strState:[%s]\n”, PDBEx->m_nRetCode, PDBEx->m_strError, PDBEx->m_strStateNativeOrigin); } pDB->Close(); |