How to use ATL OLE/DB code with an ADO connection
.
Environment: VC++ 6, Windows 2000
This article is for Visual C++ — OLE/DB programmers that are using ATL but must interact with components or code (from VB or even Visual C++) using ADO. Some time ago was really a problem for me to use such components without changing my code that was using ATL OLE/DB style for accessing a database.
The key code is where the ADO.s Connection is used to get a CSession:
. . .
GUID
IID_ACC={0x00000516,0x0000,0x0010,0x80,0x00,
0x00,0xAA,0x00,0x6D,0x2E,0xA4};
HRESULT hr;
try
{
if(!m_pADOconnection->CreateDispatch(
_T("ADODB.Connection"), e))
throw e;
CString strConnection;
strConnection.Format("Provider=Microsoft.Jet.OLEDB.4.0;
DataSource=db.mdb;");
m_pADOconnection->Open(strConnection,"admin","", 0);
propd=m_pADOconnection->m_lpDispatch;
hr=propd->QueryInterface(IID_ACC,(void**)&pUnk);
if(FAILED(hr)) return hr;
hr=((ADOConnectionConstruction15*)pUnk)->
get_Session(&pSession);
if(FAILED(hr)) return hr;
hr=pSession->QueryInterface( IID_IOpenRowset,
(void**)&pOpenRowset);
if(FAILED(hr)) return hr;
m_pSession->m_spOpenRowset.Attach(
(IOpenRowset*)pOpenRowset);
}
catch(...)
. . .