欢迎光临
我们一直在努力

ADO编程应用(2)

建站超值云服务器,限时71元/月

下面是一个简单的采用了#import方法的基于ado应用的示例代码:

#include <windows.h>

#import <msado15.dll> rename(“eof”, “adoeof”)

void main()

{

hresult hr = s_ok;

//因为没有在#import中指定no_namespace,所以必须采用adodb::这样的形式来定义变量类型

adodb::_recordsetptr rs1 = null;

//通过odbc建立ado连接

_bstr_t connect( “dsn=adodemo;uid=sa;pwd=;” );

_bstr_t source ( “select * from authors” );

coinitialize();

//初始化rs1对象

hr = rs1.createinstance( __uuidof( adodb::recordset ) );

//省略对返回值hr的判断

rs1->open( source,

connect,

adodb::adopenforwardonly,

adodb::adlockreadonly,

-1 );

//此处可以添加对记录集rs1进行操作的代码

rs1->close();

rs1 = null;

::messagebox( null,“success!”,“”,mb_ok );

couninitialize();

}

2.用mfc ole创建ado应用

mfc ole同样能够封装(wrapper)一个类型库,但是与#import不同,它不能从类型库中产生枚举类型。mfc类cstring和colevariant隐藏了bstrs和variants的细节。由mfc ole产生的类都继承了类coledispatchdriver,由ado产生的失败的hresults被封装在类coledispatchexception中。

用mfc ole classwizard创建ado应用的步骤如下:

●从tools菜单中,选择options选项中的directories tab条目,在show directories中的library files中增加路径c:\program files\common files\system\ado,设置包含ado类型库的路径。

●从view菜单中,激活classwizard,点击add class按钮并选择“from a type library…”选项,然后在type library dialog box对话框中,从c:\program files\common files\system\ado中选择文件msado15.dll,在confirm classes对话框中,选择所有列出的类并按ok按钮退出classwizard。这样,classwizard便生成了两个文件msado15.h和msado15.cpp。

下面是实现ado应用的示例代码:

//初始化com对象

afxoleinit();



//定义数据集对象

_recordset rs1;

coleexception e;

colevariant connect( “dsn=adodemo;uid=sa;pwd=;” );

colevariant source ( “select * from authors” );

//创建数据集对象

rs1.createdispatch(“adodb.recordset.2.0”,&e );

rs1.open( (variant) source,

(variant) connect,

0, 1, -1 );

//此处可以添加对结果集rs1进行处理的代码

rs1.close();

rs1.releasedispatch();

afxmessagebox(“success!”);

3.用com api创建ado工程

#import和mfc ole都围绕着一个给定的自动化对象产生了一个封装类,它们分别继承自_com_ptr_t和coledispatchdriver。其实也可以通过使用windows api函数直接初始化ado对象。为了直接使用ado和com对象,需要添加两个头文件adoid.h和adoint.h,这两个头文件定义了clsids、接口定义和操作ado类型库所需要的枚举类型。此外,还需要增加头文件initguid.h。

为了能够编译用com api创建的ado工程文件,还需要在机器中安装ole db sdk或者是msdasdk工具。下面是利用api创建ado的简单的示例代码:

#include <windows.h>

#include <initguid.h>

#include “adoid.h” // ado的guids

#include “adoint.h” // ado的类、枚举等等

void main()

{

hresult hr = s_ok;

// adorecordset 是在adoint.h中定义的

adorecordset* rs1 = null;

variant source;

variant connect;

variantinit( &source );

variantinit( &connect );

source.vt = vt_bstr;

source.bstrval = ::sysallocstring( l“select * from authors”);

connect.vt = vt_bstr;

connect.bstrval = ::sysallocstring( l“dsn=adodemo;uid=sa;pwd=;” );

hr = cocreateinstance( clsid_cadorecordset,

null,

clsctx_inproc_server,

iid_iadorecordset,

(lpvoid *) &rs1 );

if( succeeded( hr ) ) hr = rs1->open

(source,

connect,

adopenforwardonly,

adlockreadonly,

-1 );

//对记录集rs1进行处理

if( succeeded( hr ) ) hr = rs1->close();

if( succeeded( hr ) ) { rs1->release(); rs1 = null; }

if( succeeded( hr ) ) ::messagebox( null, “success!”, “”, mb_ok );

}

c++ extensions

如果用c++进行ado应用程序开发,应该使用ado c++ extensions。我们知道,用vb或者vbscript来操作ado是非常方便的,但是如果使用c++或者是java,就必须要处理类似variants这样的数据结构以实现和c++数据结构的转换,而这种处理无疑是所有c++开发人员都很头疼的事情。但如果使用c++ extensions的话,ado就不需要从数据提供者处得到列信息,而是在设计时刻使用开发人员提供的列信息。以下是一个简单的示例:

//创建和具体记录相对应的类

class cauthor : public cadorecordbinding

{

begin_ado_binding(ccustomrs1)

ado_variable_length_entry4(1,

advarchar, m_szau_id, sizeof(m_szau_id), false)

ado_variable_length_entry4(2,

advarchar,m_szau_fname,sizeof(m_szau_fname), false)

ado_variable_length_entry4(3,

advarchar,m_szau_lname,sizeof(m_szau_lname), false)

end_ado_binding()

protected:

char m_szau_id[12];

char m_szau_fname[21];

char m_szau_lname[41];

};

void fetchauthordata()

{

cauthor author;

//记录集对象

_recordsetptr prs;

iadorecordbinding *piadorecordbinding;

//获取com对象接口指针

prs.createinstance(__uuidof(recordset));

//得到需要的记录集

prs->open(“select au_id,au_fname,au_lname from employees”,“provider=sqloledb;data source=sureshk1;database=pubs;user id=sa;password=;”,

adopenforwardonly,

adlockreadonly,

adcmdtext);

//查询接口iadorecordbinding

prs->queryinterface(__uuidof(iadorecordbinding),(lpvoid*)&piadorecordbinding);

//绑定对象

piadorecordbinding->bindtorecordset(&author);

//得到记录中的相关内容

while (variant_false == prs->eof) {

printf(“%s %s %s”, author.m_szau_id,

author.m_szau_fname, author.m_szau_lname);

prs->movenext();

}

//释放对象

piadorecordbinding->release();

}

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ADO编程应用(2)
分享到: 更多 (0)

相关推荐

  • 暂无文章