Ado在vc++中的使用

Ado在vc++中的使用 作者 MaMahesh Chand 时间:2000年6月26

vc++中有三种不同的方法使用ADO.


1.通过 #import directive.
2.通过 MFC OLE based classes.
3.通过 OLE SDK

使用 #import的优势:
#import 提供一个酷似VB语法来使用ADO,无需了解底层COM。这样就没有太多压力,它极大的

简化了一个特殊对象集合特殊条目的引用。考虑下面展示的代码部分 然后将它与相似的ADO

编码技术作比较。_
1.bstr_t 和 _variant_t都是BSTR 和 VARIANT类型的封装,而这减少了我们的痛苦。
2.失败的HRESULT类型返回值会产生异常,_com_error类自动查询IErrorInfo接口获取错误的

细节。

3.COM的细节部分是隐藏的。在#import的帮助下,你从没有必要AddRef,QueryInterface or

Release.

使用 #import的不利:
1.失败的HRESULT类型返回值会产生异常
2.提供非常少的默认参数。这是在拿#import和VB比较的时候值得注意的不同点。对VB而言,

可选参数可以没有,然而#import 和 ADO,非常少的默认值实际被用上
3.#import 异常处理机制有一个bug,这个bug指的是当使用ADO出现错误不能正确释放

IErrorInfo接口

使用MFC-OLE的优点:
使用MFC-OLE的一个优点就是他隐藏了BSTR和VARIANTS的实现,方法。返回的类型是被修改的

以至于实际的包裹类返回的是CStirng类型。

使用MFC-OLE的不利:
1.HRESULTS 是隐藏的并且不是围绕方法的包裹器返回的。
2.不像#import和为OLE-SDK提供的头文件,MFC-OLE不是读取类型库来为定义在那里的枚举类

型提供值。这是在Adoutils.h文件中最好的声明
3.如果不重写CreateDispatch()]的话,对ADO1.0用户来说不能通过密钥许可。到ADO1.5版本

,MFC-OLE工作良好。然而对于ADO1.0,你必须重写COleDispatchDriver 类的2个

CreateDispatch()方法。这个在the _Connection 类的例子里面声明了。

使用OLE-SDK的优点:
大部分源于OLE-DB SDK的ADO实例是用OLD-SDK写的。Adoid.h 和
Adoint.h文件提供了大量这种类型的信息帮助#import,完全不是包裹类或者高级

bstr/variant句柄和自动IErrorInfo信息处理的功劳。

使用OLE-SDK的缺点:
这是些使用OLE-SDK的缺点
1.需要更多的代码,尤其是管理BSTR 和 VARIANT类型。
2.实际的实例代码使用的是MFC类,COleVarient和 CString来组织编码。一个纯粹的OLE-SDK

应用程序不会使用CString::AllocSysString() 方法。然而,如果你不想使用CString,你就

要找到更好的方法来完成char*和BSTR的转换

#import 和酷似VB语法的优点:

考虑下面3个代码模块,从记录集对象着手看下Field对象的实际大小

// #import
CString    strTmp;
strTmp.Format( "/t/t...Actual Size  = %ld", Rs1->Fields->Item[_variant_t((long)

0)]->ActualSize );

 

// MFC-OLE
CString     strTmp;
Fields      Flds1
Field       Fld1;
Flds1 = Rs1.GetFields();
Fld1  = Flds1.GetItem( COleVariant( (long) 0 ) );
strTmp.Format( "/t/t...Actual Size  = %ld", Fld1.GetActualSize );

最后看看OLE-SDK 实现相同功能的代码,哪一个和MFC-OLE大小差不多但却又能比他更快的得

到返回的句柄值


// OLE-SDK with ADOID.H and ADOINT.H
CString     strTmp;
ADOFields*  Flds1   = NULL;
ADOField*   Fld1    = NULL;
long        nTmp;
if( SUCCEEDED ( hr ) ) hr = Rs1->get_Fields( & Flds1 );
if( SUCCEEDED ( hr ) ) hr = Flds1->get_Item( COleVariant((long) 0 ), &Fld1 );
if( SUCCEEDED ( hr ) ) hr = Fld1->get_ActualSize( &nTmp );
if( SUCCEEDED ( hr ) ) strTmp.Format( "/t/t...Actual Size  = %ld", nTmp );


#import 和 COleDispatchDriver 以及 OLE SDK的比较

基于这个例子的三个项目,对VC++中ADO的使用做如下推荐:
#import 它巧妙的简化了COM OLE SDK 的使用
MFC-OLE虽然能立即能达到指向#import的效果,但是因为隐藏了很多东西并且不能达到有一

个失败的HRESULT.


用vc和ADO的一些其他小建议
1.当有疑问时,可以用dCmdUnknown选项参数,尤其是对于是用Execute还是 Open方法时.ADO

会帮你做正确的选择,然而使用adCmdText 命令来打开一个存储过程可能会产生问题。
2.在VB中使用vtEmpty 和 bstrEmpty 作为参数
3.捕获异常。在这种情况下,修改 ExceptEx 实例提供的帮助路线版本。ExceptEx实例指的

是跟着或者记录ADO或操作ADO机制产生的异常。


通过OLD DB SDK使用ADO
1.在源文件中加入ADO头文件adoid.h and adoint.h。
2.添加ADO包含库adoid.lib 。这2个选项用于产生ADO对象实例和访问他们的成员函数。

AdOConnection* pAdoConnection;
ADOCommand* pAdoCommand;
// Create instances of ADOConnection and ADCommand objects
CoCreateInstance(CLSID_CADOConnection, NULL, CLSCTX_INPROC_SERVER,

IID_IADOConnection,(LPVOID*)&pAdoConnection );
CoCreateInstance(CLSID_CADOCommand, NULL, CLSCTX_INPROC_SERVER, IID_IADOCommand,

(LPVOID*)&pAdoCommand );
// Call ADOConnection's Open method to connect to a database
pAdoConnection->Open(L"DSN name", L"usedid", L"password");
// pass ADOConnection to putref_ActiveConnection method of ADOCommand to connect

ADOCommand
object to ADOConnection.
pAdoCommand->putref_ActiveConnection(pAdoConnection);


现在我们可以使用 Execute 方法来得到SQL查询数据库的Recrodeset。

通过#import 指令使用ADO
添加下面的代码到STDAFX.H文件
#import "msado15.dll" rename("EOF", "ADOEOF")
using namespace ADODB;

这些代码会在你的项目中创建COM编译器支持的ADO包裹类。如果编译器不能找到

msado15.dll 你必须给出全路径。像这样c:/program files/common files/system/ado.

添加这些代码到你使用ADO的stdafx.h文件或者cpp文件
#include "comdef.h"
#include "atlconv.h"
#include <sstream.h>
using namespace std;

comdef.h 定义COM编译程序支持的类。atlconv.h定义转换ANSI,
Unicode, and OLE strings的宏。sstream是一个C++标准库,那定义了string类型的标准。

在你项目的应用程序类的OnInitInstance函数中 初始化COM库
// Initialising COM
if ( FAILED (CoInitialize(NULL) ) )
{
AfxMessageBox("Unable to initialize COM");
return FALSE;
}
在你项目的应用程序类的ExitInstance函数中释放COM库
CoUninitialize( );

做了这些你就可以在你的项目中使用ADO了。例如:

_ConnectionPtr pAdoConnection;
_CommandPtr pAdoCommand;
// Create instances of ADOConnection and ADCommand objects
pAdoConnection.CreateInstance( __uuidof( Connection ) );
pAdoCommand.CreateInstance( __uuidof( Command ) );
// Call ADOConnection's Open method to connect to a database
pAdoConnection->Open(L"DSN name", L"usedid", L"password");
// pass ADOConnection to putref_ActiveConnection method of ADOCommand to connect

ADOCommand object to
ADOConnection.
pAdoCommand->ActiveConnection = pAdoConnection;
现在我们可以使用Execute命令方法来取得SQL查询数据库的 Recrodeset .我们将会在我们的

所有例子使用#import这种方式。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值