在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。 单击“完成”。 按如下所示在 DataAccessor.cpp 中实现 GetRecordSet: STDMETHODIMP CDataAccessor::GetRecordSet(IUnknown** NativeRecordSet) { if (NativeRecordSet == NULL) return E_INVALIDARG; // Note that ADO provides the ADORecordsetConstructionPtr: ADORecordsetConstructionPtr spConsPtr; spConsPtr = m_spADORecordset; spConsPtr->get_Rowset(NativeRecordSet); return S_OK; } 在 IDataAccessor 上添加名为 CloseADO 的方法。 在“类视图”中,右击“IDataAccessor”接口。 在快捷菜单上单击“添加”,然后单击“添加方法”。 “添加方法向导”出现。 将该方法命名为 CloseADO,并且不要为该方法指定任何参数。 单击“完成”。 按如下所示在 DataAccessor.cpp 中实现 CloseADO: STDMETHODIMP CDataAccessor::CloseADO(void) { // Close the open connection m_spADOConnection->Close (); return S_OK; } 向 DataAccessor.h 中添加以下代码(用粗体表示): 注意 在以下代码中,#import 行中的路径名应该与 msado15.dll 驻留在系统上的路径相匹配。 // DataAccessor.h : Declaration of the CDataAccessor#pragma once #include "resource.h" // main symbols// The following pathname should match the path // where msado15.dll resides on your system: #import "C:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "ADOEOF") ... 在 FinalRelease 声明后添加: CComPtr<IUnknown> m_pUnkMarshaler; // Pointers for ADO used in the application: _ConnectionPtr m_spADOConnection; _RecordsetPtr m_spADORecordset; 生成项目。在“生成”菜单上,选择“生成解决方案”。
创建名为 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。
单击“完成”。
按如下所示在 DataAccessor.cpp 中实现 GetRecordSet:
STDMETHODIMP CDataAccessor::GetRecordSet(IUnknown** NativeRecordSet)
{
if (NativeRecordSet == NULL)
return E_INVALIDARG; // Note that ADO provides the ADORecordsetConstructionPtr:
ADORecordsetConstructionPtr spConsPtr;
spConsPtr = m_spADORecordset; spConsPtr->get_Rowset(NativeRecordSet); return S_OK;
}
在 IDataAccessor 上添加名为 CloseADO 的方法。
在“类视图”中,右击“IDataAccessor”接口。
在快捷菜单上单击“添加”,然后单击“添加方法”。
“添加方法向导”出现。 将该方法命名为 CloseADO,并且不要为该方法指定任何参数。
单击“完成”。
按如下所示在 DataAccessor.cpp 中实现 CloseADO:
STDMETHODIMP CDataAccessor::CloseADO(void)
{
// Close the open connection
m_spADOConnection->Close ();
return S_OK;
}
向 DataAccessor.h 中添加以下代码(用粗体表示):
注意 在以下代码中,#import 行中的路径名应该与 msado15.dll 驻留在系统上的路径相匹配。
// DataAccessor.h : Declaration of the CDataAccessor#pragma once
#include "resource.h" // main symbols// The following pathname should match the path
// where msado15.dll resides on your system:
#import "C:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "ADOEOF")
...
在 FinalRelease 声明后添加: CComPtr<IUnknown> m_pUnkMarshaler; // Pointers for ADO used in the application:
_ConnectionPtr m_spADOConnection;
_RecordsetPtr m_spADORecordset;
生成项目。在“生成”菜单上,选择“生成解决方案”。