下面是一个简单的采用了#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();
}
ADO编程应用(2)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ADO编程应用(2)
相关推荐
- 暂无文章
