描述:
我想在COM中使用ADO,实现如下:在stdafx.h加入#import语句引入ADO,结果编泽时出错.而同样的#import语句在普通的对话框中能编泽运行,真是奇怪.(我没有用ATL)
解决方案1:
在atl中可以用ado,
在atl中可以用ado,
创建名为 NativeData 的 ATL DLL 项目。
在“文件”菜单上单击“新建”,然后单击“项目”。
将出现“新建项目”对话框。
在“项目类型”窗格中,单击“Visual C++ 项目”,并在“模板”窗格中,单击“ATL 项目”。
将项目命名为 NativeData,然后单击“确定”。
即会出现“ATL 项目向导”。
单击“完成”以创建默认的 ATL 项目。
添加一个名为 DataAccessor 的新类。
在“类视图”中,右击 NativeData 项目。
在快捷菜单上单击“添加”,然后单击“添加类”。
即会出现“添加类”对话框。
单击“ATL 简单对象”并单击“打开”。
即会出现“ATL 简单对象向导”。
将对象命名为“DataAccessor”并单击“完成”以便将对象添加到项目中。
在 IDataAccessor 上添加名为 InitializeADO 的方法。
在“类视图”中,打开 NativeData 项目并右击 IDataAccessor 接口。
在快捷菜单上单击“添加”,然后单击“添加方法”。
“添加方法向导”出现。
将该方法命名为 InitializeADO,并且不要为该方法指定任何参数。
单击“完成”。
按如下所示在 DataAccessor.cpp 中实现 InitializeADO:
注意 您必须提供一个对 Pubs 数据库的连接字符串,如以下代码注释所述。更简便的方法是:在服务器资源管理器中新建一个连接,然后将“属性”窗口中的连接字符串复制给该连接。此外,如果选择在以下代码中使用 Windows NT 集成安全设置,则不需要用户 ID 和密码(因此可以将声明和定义 bstrUserID 和 bstrPassword 的行移除掉)。
STDMETHODIMP CDataAccessor::InitializeADO(void)
{
USES_CONVERSION; // Enables OLE2T macro
HRESULT hr = S_OK;
// Variables to contain connection string,
// database userid, and password.
_bstr_t bstrConnectString;
_bstr_t bstrUserID; // Remove this line if using Windows NT
// integrated security.
_bstr_t bstrPassword; // Remove this line if using Windows NT
// integrated security.
try
{
// Note: In the following lines, provide your own
// connection string to pubs and user ID as indicated:
// Initialize variables
bstrConnectString = L"YOUR CONNECTION STRING";
bstrUserID = <YOUR USER ID>;
bstrPassword = <YOUR PASSWORD>;
// Security note: hard-coding a password is
// a security weakness
// Create an instance of ADOConnection:
hr = m_spADOConnection.CreateInstance(__uuidof(Connection), NULL);
// Open the connection:
hr = m_spADOConnection->Open(bstrConnectString, bstrUserID,
bstrPassword, adOptionUnspecified);
// Create an instance of a recordset:
hr = m_spADORecordset.CreateInstance(__uuidof(Recordset), NULL);
// Open that recordset to a valid table:
_bstr_t bstrQuery(L"SELECT * FROM authors");
_variant_t vQuery(bstrQuery);
// Pass the ADOConnectionPtr to the recordset so that the
// recordset connects to the appropriate database:
_variant_t vDispatch((IDispatch*)m_spADOConnection);
m_spADOConnection->AddRef();
// Open the recordset. Note that when you call
// GetRecordSet you get a pointer to this recordset:
hr = m_spADORecordset->Open(vQuery,
vDispatch,
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error &err)
{
TCHAR szBuf[2056];
_tcscpy(szBuf, _T(""));
_tcscat(szBuf, err.ErrorMessage());
_bstr_t bstrSource(err.Source());
_bstr_t bstrDesc(err.Description());
_tcscat(szBuf, (char*)bstrSource);
_tcscat(szBuf, (char*)bstrDesc);
#ifdef _DEBUG
OutputDebugString(szBuf);
#endif // _DEBUG
return E_FAIL;
}
return S_OK;
}
在 IDataAccessor 上添加名为 GetRecordSet 的方法。
在“类视图”中,右击“IDataAccessor”接口。
在快捷菜单上单击“添加”,然后单击“添加方法”。
“添加方法向导”出现。
将该方法命名为 GetRecordSet,并为该方法指定一个 [out,retval] 参数 IUnknown** NativeRecordSet。
单