两种ADO初始化方法,却得到不同效果!请教高手解决
先说说成功的方法
使用MFC向导,生成一个基于对话框的工程
在stdafx.h中的最后添加
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")
编译,在debug目录下生成两个文件,msado.tli tlh,将他们引入工程。
然后在对话框添加列表框和按钮,添加按钮单击响应函数OnBtnQuery(),代码如下:
void CAdoDlg::OnBtnQuery()
{
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
_CommandPtr pCmd(__uuidof(Command));
pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs";
pConn->Open("","","",adConnectUnspecified);
pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));
pCmd->CommandText="select * from authors";
pRst=pCmd->Execute(NULL,NULL,adCmdText);
while(!pRst->rsEOF)
{
((CListBox*)GetDlgItem(IDC_LIST1))->AddString(
(_bstr_t)pRst->GetCollect("au_lname"));
pRst->MoveNext();
}
pRst->Close();
pConn->Close();
pCmd.Release();
pRst.Release();
pConn.Release();
CoUninitialize();
}
编译通过,执行正确!
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
以下是另外一种方法,结果是编译不通过!
向导生成一个多文档工程,添加老地方import语句,另外还加了个头文件#include <comdef.h>
如上编译通过,debug下生成两个文件,引用之。
在app的InitInstance()下加了句AfxOleInit();
另外在Doc类的.h中加入两个变量:
BOOL m_IsConnectionOpen;
_CollectionPtr m_pConnection;
在Doc类的.cpp中的构造函数初始化两变量:
m_IsConnectionOpen = FALSE;
m_pConnection = NULL;
--〉关键地方到了
在Doc类的.cpp的OnNewDocument()中创建连接,代码如下:
BOOL CDatabasetestDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
HRESULT hr;
hr = m_pConnection.CreateInstance(__uuidof(Connection));
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open(。。。)//里面的参数与第一个例子一样。
}
return TRUE;
}
编译就开始报错了!
error C2039: 'Open' : is not a member of '_Collection'
see declaration of '_Collection'
怪了,注释掉Open,设置断点到CreateInstance处也是发现hr总是个很大的负数
如果采用第一种方法在OnNewDocument()中定义局部变量,并初始化,就没问题!
特此请教高手!
在线等待
谢谢