C++数据库编程ODBC基本概念ODBC(OpenDatabaseConnectivity,开放数据库互连)是微软公司开放服务结构(WOSA,WindowsOpenServicesArchitecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBCAPI进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。一个完整的ODBC由下列几个部件组成:应用程序(Application)。ODBC管理器(Administrator)。该程序位于Windows95控制面板(ControlPanel)的32位ODBC内,其主要任务是管理安装的ODBC驱动程序和管理数据源。驱动程序管理器(DriverManager)。驱动程序管理器包含在ODBC32.DLL中,对用户是透明的。其任务是管理ODBC驱动程序,是ODBC中最重要的部件。ODBCAPI。ODBC驱动程序。是一些DLL,提供了ODBC和数据库之间的接口。数据源。数据源包含了数据库位置和数据库类型等信息,实际上是一种数据连接的抽象。各部件之间的关系如图下图所示:应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。在ODBC中,ODBCAPI不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对ODBCAPI的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。在访问ODBC数据源时需要ODBC驱动程序的支持。用VisualC++5.0安装程序可以安装SQLServer、Access、Paradox、dBase、FoxPro、Excel、Oracle和MicrosoftText等驱动程序.在缺省情况下,VC5.0只会安装SQLServer、Access、FoxPro和dBase的驱动程序.如果用户需要安装别的驱动程序,则需要重新运行VC5.0的安装程序并选择所需的驱动程序。ADO对象访问模型本节简要介绍了微软的活动数据对象(ADO)模型,结合实例阐述了在VisualC++环境下使用ADO操纵数据库的基本步骤,分析ADO的特点及与开放式数据库连接(ODBC)的差异与应用前景。关键词:活动数据对象数据库VisualC++1ADO是微软整个COM战略体系中的一个组成部分活动数据对象(ADO)是一组由微软提供的COM组件。ADO建立在微软所提倡的COM体系结构之上,它的所有接口都是自动化接口,因此在C++、VisualBasic、Delphi等支持COM的开发语言中通过接口都可以访问到ADO。ADO通过使用OLEDB这一新技术实现了以相同方式可以访问关系数据库、文本文件、非关系数据库、索引服务器和活跃目录服务等的数据,扩大了应用程序中可使用的数据源范围,从而成为微软整个COM战略体系中访问数据源组件的首选,是ODBC的替代产品。2ADO对象模型组成与微软的其它数据访问模型DAO和RDO相比,ADO对象模型非常精炼,仅由三个主要对象Connection、Command、Recordset和几个辅助对象组成,其相互关系如图所示。Connection对象提供OLEDB数据源和对话对象之间的关联,它通过用户名称和口令来处理用户身份的鉴别,并提供事务处理的支持;它还提供执行方法,从而简化数据源的连接和数据检索的进程。Command对象封装了数据源可以解释的命令,该命令可以是SQL命令、存储过程或底层数据源可以理解的任何内容。Recordset用于表示从数据源中返回的表格数据,它封装了记录集合的导航、记录更新、记录删除和新记录的添加等方法,还提供了批量更新记录的能力。其它辅助对象则分别提供封装ADO错误、封装命令参数和封装记录集合的列。3ADO的特点分析(1)由于封装了许多底层工作,使用ADO与使用ODBC几乎是一样方便。(2)ADO不仅具有ODBC的主要功能,而且ADO适用的数据源的范围要大的多。(3)在定义ADO记录集变量和数据库表字段绑定类时,要求记录集的字段变量、状态变量与数据库表字段的个数、顺序必须相同。这一点比在FMC中使用ODBC要复杂一些。但在数据库字段与ADO记录集字段变量绑定的宏中,ADO提供的数据类型要远多于FMC中的RFX(如日期时间类型,在ODBC中只能转换为Cstring类型)。(4)ADO允许同一Connection实例下有多个Recordset实例。(5)ADO允许进行批更新(使用的UpdateBatch方法),这样将大大减轻网络负担,提高数据库处理效率。4ADO在VisualC++中的使用利用微软在MicrsoftStudio6中提供的ADO2,可以在VisualC++中使用ADO接口操纵SQLSERVER数据库。在编译型高级语言中使用ADO,比起在一些脚本语言(如VisualBasicScropt和JavaScript)中使用ADO要困难一些。以下给出一个VisualC++下使用ADO的Connection对象及其Recordset对象的基本步骤:(1)使用import指令引入ADO2组件例:#importC:\ADO\msado15.dllno_namespacerename(EOF,EndOfFile)(2)定义CADORecordBinding的派生类,用于程序与数据库表字段的交互,该类的定义可参见icrsint.h。例:classCIntlive:publicCADORecordBinding{public:DBTIMESTAMPm_datetime;//定义ADO记录集字段变量(与数据库表字段相对应)longm_key;longm_value;longm_quality;WORDm_stsdatetime;//定义ADO记录集状态变量WORDm_stskey;WORDm_stsvalue;WORDm_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()};(3)调用CoInitialize初始化COM::CoInitialize(NULL);(4)声明ADO的Connection对象指针和Recordset对象指针并初始化。(类型名在msado15.dll中已定义)例:_ConnectionPtrpConnection1=NULL;_RecordsetPtrrstADO1=NULL;(5)定义CADORecordBinding派生类的实例及其Bind接口指针。例:CIntlivem_intdata;IADORecordBinding*rstADOBind1=NULL;(6)产生Connection对象实例和Recordset对象实例。例:pConnection1.CreateInstance(_uuidof(Connection));rstADO1.CreateInstance(__uuidof(Recordset));(7)连接到数据库并打开Recordset对象,其中open函数的参数的使用方法可参见微软MSDN中ADO相应对象参数的Basic描述。例:PConnection1-Open(driver={SQLserver};server=servera;uid=sa;pwd=;database=pubs,,,NULL);rstADO1-Open(data,_variant_t((IDispatch*)pConnection1,true),adOpenKeyset,adLockBatchOptimistic,adCmdTable);(8)将CADORecordBinding派生类的实例联编到Recordset对象的Bind接口。例:RstADOBind1-BindToRecordset(&m_intdata);(9)对Recordset对象实例进行操作。操作方法可参见微软MSDN中ADORecordset对象相应方法的Basic描述。例:rstADO1-MoveNext();//移动游标到下一条记录rstADO1-Update(_variant_t(quality),_variant_t(3)));//修改记录的quality字段的值为3rstADO1-UpdateBatch(adAffectAll));//将在Recordset对象上的所有更新一次送入数据库(10)关闭Recordset对象并释放Bind接口。例:RstADO1-Close();RstADOBind2-Release();(11)关闭连接pConnection1-Close();(12)调用CoUnitialize释放COM资源::CoUninitialize();5结论作为ODBC的替代产品,ADO确实有其过人之处。由于ADO数据源几乎覆盖了目前常见的数据源类型,对于ODBC所不支持的数据源,ADO无疑是唯一的选择。而ADO的批更新功能,更是网络环境下大数据量更新应用的重要因素。由于ADO缺乏大量的第三方厂商的支持,使得ADO目前远不如ODBC普及,但其面向对象的特性将使ADO具有比较广阔的发展前景。ODBC编程实例MicrosoftDeveloperStudio为大多数标准的数据库格式提供了32位ODBC驱动器。这些标准数据格式包括有:SQLServer、Access、Paradox、dBase、FoxPro、Excel、Oracle以及MicrosoftText。如果用户希望使用其他数据格式,则需要安装相应的ODBC驱动器及DBMS。用户使用自己的DBMS数据库管理功能生成新的数据库模式后,就可以使用ODBC来登录数据源。对用户的应用程序来说,只要安装有驱动程序,就能注册很多不同的数据库。登录数据库的具体操作参见有关ODBC的联机帮助。一、MFC提供的ODBC数据库类VisualC++的MFC基类库定义了几个数据库类。在利用ODBC编程时,经常要使用到CDatabase(数据库类)、CRecordSet(记录集类)和CRecordView(可视记录集类)。CDatabase类对象提供了对数据源的连接,通过它可以对数据源进行操作。CRecordSet类对象提供了从数据源中提取出的记录集。CRecordSet对象通常用于两种形式:动态行集(dynasets)和快照集(snapshots)。动态行集能与其他用户所做的更改保持同步,快照集则是数据的一个静态视图。每种形式在记录集被打开时都提供一组记录,所不同的是,当在一个动态行集里滚动到一条记录时,由其他用户或应用程序中的其他记录集对该记录所做的更改会相应地显示出来。CRecordView类对象