2010年11月03日


大多数应用程序都使用数据库,各种管理软件、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的替代产品。      


bohut用户头像
bohut
(●●伯虎●●)
等 级:


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具有比较广阔的发展前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值