分享
 
 
 

ADO VC++ Extensions使用详解

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

ADO VC++ Extensions是ADO 2.0 版本提供的新接口,它支持不通过 VARIANT 便可将数据检索到本地的 C/C++ 数据类型中。此外,它还提供能简化接口使用过程的预处理宏,这些扩展程序使用简便并且性能良好。

ADO VC++ Extensions 可将 Recordset 对象的字段映射到 C/C++ 变量,字段与变量的映射称为绑定条目。预处理宏用来定义数值、定长和变长变量的绑定。

我们以一个简单的程序为例,说明如何在VC++中使用带Extensions 的ADO访问SQL SERVER数据库。我们假定安装了SQL SERVER数据库的Netbios名为nt_sqlserver,要访问的数据库名为pubs,操作的表名为authors。

我们可以新建一个空的工程,选择Win32 Console Application类型。先加入一个头文件,并命名为ADOtest.h,源代码如下:

//要使用 VC++ Extensions,必须在应用程序中包含的头文件:

#include "icrsint.h"

// 该类从"authors"表中 摘取出 fname, lname, city和state 四个字段

class CAuthorsRs : public CADORecordBinding

{

BEGIN_ADO_BINDING(CAuthorsRs)

ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_au_fname,

sizeof(m_au_fname), l_fnameStatus, TRUE)

ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_au_lname,

sizeof(m_au_lname), l_lnameStatus, TRUE)

ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_au_city,

sizeof(m_au_city), l_cityStatus, TRUE)

ADO_VARIABLE_LENGTH_ENTRY2(4, adChar, m_au_state,

sizeof(m_au_state), l_stateStatus, TRUE)

END_ADO_BINDING()

public:

char m_au_fname[21];

ULONGl_fnameStatus;

char m_au_lname[41];

ULONGl_lnameStatus;

char m_au_city[21];

ULONGl_cityStatus;

char m_au_state[3];

ULONGl_stateStatus;

};

注意,将 BEGIN_ADO_BINDING 和 END_ADO_BINDING 宏之间的绑定条目用括号括起。不要在绑定条目结尾使用逗号或分号,因为这些定界符仅限在宏中使用。

ADO_VARIABLE_LENGTH_BINDING

_ENTRY2的参数说明如下:

参数1:按顺序的字段号码,1为标识记录集中第一字段,2为标识记录集中第二字段,依此类推。

参数2:储存已转换字段的变量的数据类型。

参数3:临时的工作缓冲区,用于将字段值从 VARIANT转换为C/C++ 变量。

参数4:变长变量所需的字节数。

参数5:指示字段转换是否成功。

参数6:布尔标志。如果为 TRUE,则表明 ADO 可以更新绑定的字段。如只检查字段而不将其更改,可设置为 FALSE。

其中第5个参数为状态参数,它可告诉你从 Recordset 字段到C或C++变量的转换是否成功以及变量的内容是否有效。该参数的两个最重要的值是adFldOK(意味着转换成功)和adFldNull(意味着字段是NULL,即无值可供转换)。程序中要检测该参数以决定C或C++变量是否有效。例如,如果字段具有有效的行内容,状态将会是adFldOK,如果移动到另一个字段为 NULL 的行,则状态将是 adFldNull。

源程序代码如下:

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \

no_namespace rename("EOF", "EndOfFile")

#include 〈stdio.h〉

#include 〈ole2.h〉

#include "ADOtest.h"

void main()

{

if(FAILED(::CoInitialize(NULL)))

return;

// 定义ADO 智能指针类的实例,并初始化

RecordsetPtr pRstAuthors= NULL;

//定义其它变量

//接口指针声明

IADORecordBinding picRs = NULL; CAuthorsRsauthorsrs;

//ADO函数要返回HRESULT,宏代码可以帮我们解释HRESULT的含义

HRESULT hr;

// 打开 位于nt_sqlserver服务器上的 pubs数据库中的 Authors 表

bstr_t strCnn("Provider=sqloledb;Data Source=nt_sqlserver;"

"Initial Catalog=pubs;User Id=sa;Password=;");

try

{

// 从 Authors 表中打开记录集

if FAILED(hr = pRstAuthors.CreateInstance(__uuidof(Recordset)))

com_issue_error(hr);

pRstAuthors-〉CursorType = adOpenStatic;

// 使用 client 游标 ,从而可以使用 AbsolutePosition 属性pRstAuthors-〉CursorLocation = adUseClient;

pRstAuthors-〉Open("SELECT au_fname, au_lname, city, "

"state FROM Authors ORDER BY au_id", strCnn, adOpenStatic,

adLockReadOnly, adCmdText);

// 打开一个 IADORecordBinding 接口指针(用来对记录集和C++类的绑定)

if FAILED(hr = pRstAuthors-〉QueryInterface(_uuidof(IADORecordBinding),(LPVOID)&&picRs))

_com_issue_error(hr);

// 调用 BindToRecordset 接口方法可使 Recordset 字段关联(或绑定)到C/C++ 变量,无论何时更改 Recordset 对象的当前行,C/C++ 变量都将自动更新

if FAILED(hr = picRs-〉BindToRecordset(&&authorsrs))

_com_issue_error(hr);

pRstAuthors-〉MoveFirst();

while(true)

{

// 显示当前记录的信息

printf("Record %ld of %d\n", pRstAuthors-〉AbsolutePosition,pRstAuthors-〉RecordCount);

printf("Author: %s %s\n ",

authorsrs.l_fnameStatus == adFldOK ?

authorsrs.m_au_fname : "〈NULL〉",

authorsrs.l_lnameStatus == adFldOK ?

authorsrs.m_au_lname : "〈NULL〉");

printf("Location: %s, %s\n",

authorsrs.l_cityStatus == adFldOK ?

authorsrs.m_au_city : "〈NULL〉",

authorsrs.l_stateStatus == adFldOK ?

authorsrs.m_au_state : "〈NULL〉");

pRstAuthors-〉MoveNext();

if(pRstAuthors-〉EndOfFile)

{

break;

}

}

// 退出前释放对象

pRstAuthors-〉Close();

// 这里释放 IADORecordset 接口

if (picRs)

picRs-〉Release();

}

catch(_com_error &&e)

{

_bstr_t bstrSource(e.Source());

_bstr_t bstrDescription(e.Description());

printf("Error\n");

printf("\tCode = %08lx\n", e.Error());

printf("\tCode meaning = %s\n", e.ErrorMessage());

printf("\tSource = %s\n", (LPCSTR) bstrSource);

printf("\tDescription = %s\n", (LPCSTR) bstrDescription);

}

::CoUninitialize();

}

编译链接之后,程序就可以运行了。这个例子的作用是将SQL SERVER中pubs库中authors表中的记录按字段au_id排序后,将记录在记录集中的位置、姓名、城市等几个字段的内容依次显示在屏幕上。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有