WHY??ODBC驱动程序屏蔽了DBMS之间的差异。
看看对你是否有帮助`````
大多数应用程序都使用数据库,各种管理软件、ERP、CRM系统均需要数据库来保存和维护应用程序的数据,在VC中提供了多种数据库访问技术,不过目前最流行的是ODBC(开放式数据库接口)和ADO(活动对象模型)。
一.数据库技术初步
1.ODBC基本概念
ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。
一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。
一个完整的ODBC由下列几个部件组成:
应用程序(Application)。
ODBC管理器(Administrator)。该程序位于Windows 95控制面板(Control Panel)的32位ODBC内,其主要任务是管理安装的ODBC驱动程序和管理数据源。
驱动程序管理器(Driver Manager)。驱动程序管理器包含在ODBC32.DLL中,对用户是透明的。其任务是管理ODBC驱动程序,是ODBC中最重要的部件。
ODBC API。
ODBC 驱动程序。是一些DLL,提供了ODBC和数据库之间的接口。
数据源。数据源包含了数据库位置和数据库类型等信息,实际上是一种数据连接的抽象。
应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。
在ODBC中,ODBC API不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对ODBC API的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。
在访问ODBC数据源时需要ODBC驱动程序的支持。用Visual C++ 5.0安装程序可以安装SQL Server、 Access、 Paradox、 dBase、 FoxPro、 Excel、 Oracle 和Microsoft Text等驱动程序.在缺省情况下,VC5.0只会安装SQL Server、 Access、 FoxPro和dBase的驱动程序.如果用户需要安装别的驱动程序,则需要重新运行VC 5.0的安装程序并选择所需的驱动程序。
2.ADO对象访问模型
1)ADO是微软整个COM战略体系中的一个组成部分
活动数据对象(ADO)是一组由微软提供的COM组件。 ADO建立在微软所提倡的COM体系结构之上,它的所有接口都是自动化接口,因此在C++、VisualBasic、Delphi等支持COM的开发语言中通过接口都可以访问到ADO。ADO通过使用OLE DB这一新技术实现了以相同方式可以访问关系数据库、文本文件、非关系数据库、索引服务器和活跃目录服务等的数据,扩大了应用程序中可使用的数据源范围,从而成为微软整个COM战略体系中访问数据源组件的首选,是ODBC的替代产品。
2)ADO对象模型组成
与微软的其它数据访问模型DAO和RDO相比,ADO对象模型非常精炼,仅由三个主要对象Connection、Command、Recordset和几个辅助对象组成。Connection对象提供OLE DB数据源和对话对象之间的关联,它通过用户名称和口令来处理用户身份的鉴别,并提供事务处理的支持;它还提供执行方法,从而简化数据源的连接和数据检索的进程。Command对象封装了数据源可以解释的命令,该命令可以是SQL命令、存储过程或底层数据源可以理解的任何内容。Record set用于表示从数据源中返回的表格数据,它封装了记录集合的导航、记录更新、记录删除和新记录的添加等方法,还提供了批量更新记录的能力。其它辅助对象则分别提供封装ADO错误、封装命令参数和封装记录集合的列。
3)ADO的特点分析
(a)由于封装了许多底层工作,使用ADO与使用ODBC几乎是一样方便。
(b) ADO不仅具有ODBC的主要功能,而且ADO适用的数据源的范围要大的多。
(c)在定义ADO记录集变量和数据库表字段绑定类时,要求记录集的字段变量、状态变量与数据库表字段的个数、顺序必须相同。这一点比在FMC中使用ODBC要复杂一些。但在数据库字段与ADO记录集字段变量绑定的宏中,ADO 提供的数据类型要远多于FMC中的RFX(如日期时间类型,在ODBC中只能转换为Cstring类型)。
(d)ADO允许同一Connection实例下有多个Record set实例。
(e)ADO允许进行批更新(使用的Update Batch方法),这样将大大减轻网络负担,提高数据库处理效率。
4) ADO在Visual C++中的使用
利用微软在Micrsoft Studio 6中提供的ADO2,可以在Visual C++中使用ADO接口操纵SQL SERVER数据库。在编译型高级语言中使用ADO,比起在一些脚本语言(如Visual Basic Scropt和JavaScript)中使用ADO要困难一些。
以下给出一个Visual C++下使用ADO的Connection对象及其Record set对象的基本步骤:
(a) 使用import指令引入ADO2组件
例:#import "C:\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
(b) 定义CADORecordBinding 的派生类,用于程序与数据库表字段的交互,该类的定义可参见icrsint.h。
例:
class CIntlive : public CADORecordBinding
{
public:
DBTIMESTAMP m_datetime; //定义ADO记录集字段变量(与数据库表字段相对应)
long m_key;
long m_value;
long m_quality;
WORD m_stsdatetime; //定义ADO记录集状态变量
WORD m_stskey;
WORD m_stsvalue;
WORD m_stsquality;
BEGIN_ADO_BINDING(CIntlive) //将数据库字段与ADO记录集字段变量绑定
ADO_VARIABLE_LENGTH_ENTRY2(1,adDBTimeStamp,m_datetime,sizeof(m_datetime),m_stsdatetime,true)
ADO_NUMERIC_ENTRY(2,adInteger,m_key,10,0,m_stskey,true)
ADO_NUMERIC_ENTRY(3,adInteger,m_value,10,0,m_stsvalue,true)
ADO_NUMERIC_ENTRY(4,adInteger,m_quality,10,0,m_stsquality,true)
END_ADO_BINDING()
};
(c) 调用CoInitialize初始化COM ::CoInitialize(NULL);
(d) 声明ADO的Connection对象指针和Recordset对象指针并初始化。(类型名在 msado15.dll中已定义)
例:
_ConnectionPtr pConnection1 = NULL;
_RecordsetPtr rstADO1 = NULL;
(e) 定义CADORecordBinding派生类的实例及其Bind接口指针。
例:
CIntlive m_intdata;
IADORecordBinding *rstADOBind1 = NULL;
(f) 产生Connection对象实例和Record set对象实例。
例:
pConnection1.CreateInstance(_uuidof(Connection));
rstADO1.CreateInstance(__uuidof(Recordset)) ;
(g) 连接到数据库并打开Record set对象,其中open函数的参数的使用方法可参见微软MSDN中ADO 相应对象参数的Basic描述。
例:
PConnection1->Open("driver={SQL server};server=servera;uid=sa;pwd=;database=pubs","","",NULL);
rstADO1->Open("data", _variant_t((IDispatch *)pConnection1,true),
adOpenKeyset,adLockBatchOptimistic, adCmdTable);
(h) 将CADORecordBinding派生类的实例联编到Record set对象的Bind接口。
例:
RstADOBind1->BindToRecordset(&m_intdata);
(i) 对Record set对象实例进行操作。操作方法可参见微软MSDN中ADO Record set对象相应方法的Basic描述。
例:
rstADO1->Move Next(); //移动游标到下一条记录
rstADO1->Update(_variant_t("quality"),_variant_t("3"))); //修改记录的quality字段的值为3
rstADO1->Update Batch(adAffectAll)); //将在Record set对象上的所有更新一次送入数据库
(j) 关闭Record set对象并释放Bind接口。
例:
RstADO1->Close();
RstADOBind2->Release();
(k) 关闭连接 pConnection1->Close();
(l) 调用CoUnitialize释放COM资源 ::CoUninitialize();
5) 结论
作为ODBC的替代产品,ADO确实有其过人之处。由于ADO数据源几乎覆盖了目前常见的数据源类型,对于ODBC所不支持的数据源,ADO无疑是唯一的选择。而ADO的批更新功能,更是网络环境下大数据量更新应用的重要因素。由于ADO缺乏大量的第三方厂商的支持,使得ADO目前远不如ODBC普及,但其面向对象的特性将使ADO具有比较广阔的发展前景。
3.ADO与ODBC的区别
有很多种使用数据库的方法,对大多数数据库来说,选择C++这种产品也许并不适宜。我们知道,像dBASE IV,FoxPro,Oracle和Access这样的产品是完全以数据库管理为中心的。事实上,这些产品非常善于创建数据库管理器,以至于它们确实并不善于做太多其它的工作。即使要用更通用化而非更专用化的数据库产品来执行一些类型的工作,在使程序设计更容易这一方面,像VisualBasic和Delphi这样的RAD环境也要比Visual C++强很多。
你是不是对我的说法感到很奇怪?下面我就要谈一谈,在谈到使用数据库管理系统(DBMS)这个话题时,用Visual C++实际上可以做些什么。虽然上述其它语言使得编写成熟的包括用户界面和高速搜索能力的DBMS就像孩子做游戏一样容易,但是,它们缺少Visual C++可以提供的某些重要东西。你不能为使用Access的数据库轻松地编写出实用程序。正像实用程序的定义所说的,实用程序应该很小并且具备可移植性——Access应用程序却不是这样。即使用Access这样的产品创建的程序可以很小并且可以移植,你仍有其它方面的需求:底层的功能。
注:编写数据库实用程序及驱动程序时,可以选择Visual C++语言。
想像一下,使用像Visual Basic这样的语言来与实时数据采集设备打交道的情况。在进行底层访问时,RAD的保护环境常常使程序员不能进行有效的处理。当然,数据采集设备几乎不依赖于简明的连接。你打算如何把Visual Basic和外部的数据源连接起来呢?数据源甚至可能不了解Windows,DOS或类似的成熟的操作系统。
只要使用得当,很容易看到Visual C++是一种不可或缺的数据库管理工具。针对大规模的应用程序,即使你仍想依赖于Visual Basic这样的RAD语言,也请考虑一下Visual C++,它创建的程序规模小、提供底层访问并能提供实时访问。事实上,你可能还没有想到,Visual C++数据库应用程序的市场是很有潜力的。随着人们在旅途中越来越多地使用膝上型和掌上型电脑,这两类电脑上的数据库应用程序也变得越来越普通。你也许能够适应今天的膝上型电脑上的Access应用程序,但谈到硬盘大小或内存需求时,公司里较老的膝上型电脑可能就达不到要求。运行Windows CE的掌上型电脑在运行这个Access应用程序时,肯定会发生故障。在这一数据库市场的新领域,Visual C++提供了无价无限的工具。