分享
 
 
 

简析Visual C++中的活动数据对象(ado)

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

程序运行效果截图:

摘 要: 本文简要介绍了微软的活动数据对象(ADO)模型,结合实例阐述了在Visual C++环境下使用ADO操纵数据库的基本步骤,分析ADO的特点及与开放式数据库连接(ODBC)的差异与应用前景。

左图:ADO对象模型

关键词: 活动数据对象 数据库 Visual C++

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的特点分析

(1)由于封装了许多底层工作,使用ADO与使用ODBC几乎是一样方便。

(2) ADO不仅具有ODBC的主要功能,而且ADO适用的数据源的范围要大的多。

(3)在定义ADO记录集变量和数据库表字段绑定类时,要求记录集的字段变量、状态变量与数据库表字段的个数、顺序必须相同。这一点比在FMC中使用ODBC要复杂一些。但在数据库字段与ADO记录集字段变量绑定的宏中,ADO 提供的数据类型要远多于FMC中的RFX(如日期时间类型,在ODBC中只能转换为Cstring类型)。

(4)ADO允许同一Connection实例下有多个Record set实例。

(5)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对象的基本步骤:

(1) 使用import指令引入ADO2组件

例:#import "C:ADOmsado15.dll" no_namespace rename("EOF", "EndOfFile")

(2) 定义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()

};

(3) 调用CoInitialize初始化COM ::CoInitialize(NULL);

(4) 声明ADO的Connection对象指针和Recordset对象指针并初始化。(类型名在 msado15.dll中已定义)

例:

_ConnectionPtr pConnection1 = NULL;

_RecordsetPtr rstADO1 = NULL;

(5) 定义CADORecordBinding派生类的实例及其Bind接口指针。

例:

CIntlive m_intdata;

IADORecordBinding *rstADOBind1 = NULL;

(6) 产生Connection对象实例和Record set对象实例。

例:

pConnection1.CreateInstance(_uuidof(Connection));

rstADO1.CreateInstance(__uuidof(Recordset)) ;

(7) 连接到数据库并打开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);

(8) 将CADORecordBinding派生类的实例联编到Record set对象的Bind接口。

例:

RstADOBind1->BindToRecordset(&m_intdata);

(9) 对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对象上的所有更新一次送入数据库

(10) 关闭Record set对象并释放Bind接口。

例:

RstADO1->Close();

RstADOBind2->Release();

(11) 关闭连接 pConnection1->Close();

(12) 调用CoUnitialize释放COM资源 ::CoUninitialize();

5 结论

作为ODBC的替代产品,ADO确实有其过人之处。由于ADO数据源几乎覆盖了目前常见的数据源类型,对于ODBC所不支持的数据源,ADO无疑是唯一的选择。而ADO的批更新功能,更是网络环境下大数据量更新应用的重要因素。由于ADO缺乏大量的第三方厂商的支持,使得ADO目前远不如ODBC普及,但其面向对象的特性将使ADO具有比较广阔的发展前景。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有