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(...) . . .