DWORD CTextildb::Open() { SetCursor(LoadCursor(NULL,IDC_WAIT)); DWORD dr; DWORD rc; HRESULT hr; IDataInitialize * pIDataInitialize = NULL; IDBInitialize * pIDBInitialize = NULL; IDBCreateSession* pIDBCreateSession = NULL; IUnknown * pUnkSession = NULL; ICommandText* pICommandText = NULL; IDBCreateCommand* pICreateCommand = NULL; char cConnectionStr[500]; strcpy(cConnectionStr,"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=bd1.mdb;Persist Security Info=False"); db_CharToWChar(cConnectionStr); for(;;) { dr = ERR_OLEDBFAIL; hr = CoCreateInstance(CLSID_MSDAINITIALIZE,NULL,CLSCTX_INPROC_SERVER,IID_IDataInitialize,(VOID **)&pIDataInitialize); if (hr != S_OK) break; hr = pIDataInitialize->GetDataSource(NULL,CLSCTX_INPROC_SERVER,(LPCOLESTR)cConnectionStr,IID_IDBInitialize,(IUnknown **)&pIDBInitialize); if (hr != S_OK) break; hr = pIDBInitialize->Initialize(); if (hr != S_OK) break; hr = pIDBInitialize->QueryInterface(IID_IDBCreateSession, (void**)&pIDBCreateSession); if (hr != S_OK) break; hr = pIDBCreateSession->CreateSession(NULL,IID_IOpenRowset,&pUnkSession ); if (hr != S_OK) break; hr = pUnkSession->QueryInterface(IID_IDBCreateCommand,(void**)&pICreateCommand); if (hr != S_OK) break; hr = pICreateCommand->CreateCommand(NULL,IID_ICommand,(IUnknown**)&m_lpICommand); if (hr != S_OK) break; dr = ERR_NONE; break; }; if (pIDataInitialize) rc = pIDataInitialize->Release(); if (pIDBInitialize) rc = pIDBInitialize->Release(); if (pIDBCreateSession) rc = pIDBCreateSession->Release(); if (pUnkSession) rc = pUnkSession->Release(); if (pICreateCommand) rc = pICreateCommand->Release(); if (hr != S_OK) { if (m_lpICommand) rc = m_lpICommand->Release(); m_lpICommand = NULL; } SetCursor(LoadCursor(NULL,IDC_ARROW)); return ERR_OLEDBFAIL; }
HRESULT GetSampprovDataSource ( IDBInitialize** ppIDBInitialize_out ) { IDBInitialize* pIDBInit = NULL; IDBProperties* pIDBProperties = NULL; DBPROPSET dbPropSet[1]; DBPROP dbProp[1]; HRESULT hr; DumpStatusMsg( "Connecting to the SampProv sample data provider...\n" ); assert(ppIDBInitialize_out != NULL); VariantInit(&(dbProp[0].vValue)); // Create an instance of the SampProv sample data provider hr = CoCreateInstance( CLSID_SampProv, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void **)&pIDBInit ); if (FAILED(hr)) { DUMP_ERROR_LINENUMBER(); DumpErrorHResult( hr, "CoCreateInstance" ); goto error; } // Initialize this provider with the path to the customer.csv file dbPropSet[0].rgProperties = &dbProp[0]; dbPropSet[0].cProperties = 1; dbPropSet[0].guidPropertySet = DBPROPSET_DBINIT; dbProp[0].dwPropertyID = DBPROP_INIT_DATASOURCE; dbProp[0].dwOptions = DBPROPOPTIONS_REQUIRED; dbProp[0].colid = DB_NULLID; V_VT(&(dbProp[0].vValue)) = VT_BSTR; V_BSTR(&(dbProp[0].vValue)) = SysAllocString( L"." ); if ( NULL == V_BSTR(&(dbProp[0].vValue)) ) { DUMP_ERROR_LINENUMBER(); DumpErrorMsg( "SysAllocString failed\n" ); goto error; } hr = pIDBInit->QueryInterface( IID_IDBProperties, (void**)&pIDBProperties); if (FAILED(hr)) { DUMP_ERROR_LINENUMBER(); DumpErrorHResult( hr, "IDBInitialize::QI for IDBProperties"); goto error; } hr = pIDBProperties->SetProperties( 1, &dbPropSet[0]); if (FAILED(hr)) { DUMP_ERROR_LINENUMBER(); DumpErrorHResult( hr, "IDBProperties::SetProperties" ); goto error; } hr = pIDBInit->Initialize(); if (FAILED(hr)) { DUMP_ERROR_LINENUMBER(); DumpErrorHResult( hr, "IDBInitialize::Initialize" ); goto error; } *ppIDBInitialize_out = pIDBInit; hr = ResultFromScode( S_OK ); error: VariantClear( &(dbProp[0].vValue) ); if( pIDBProperties ) pIDBProperties->Release(); if( FAILED(hr) ) { if (pIDBInit) pIDBInit->Release(); *ppIDBInitialize_out = NULL; } return hr; }
/******************************************************************** SqlConnectDatabase - establishes a connection to a database NOTE: wzInstance is optional if fIntegratedAuth is set then wzUser and wzPassword are ignored ********************************************************************/ extern "C" HRESULT DAPI SqlConnectDatabase( __in_z LPCWSTR wzServer, __in_z LPCWSTR wzInstance, __in_z LPCWSTR wzDatabase, __in BOOL fIntegratedAuth, __in_z LPCWSTR wzUser, __in_z LPCWSTR wzPassword, __out IDBCreateSession** ppidbSession ) { Assert(wzServer && wzDatabase && *wzDatabase && ppidbSession); HRESULT hr = S_OK; IDBInitialize* pidbInitialize = NULL; IDBProperties* pidbProperties = NULL; LPWSTR pwzServerInstance = NULL; DBPROP rgdbpInit[4]; DBPROPSET rgdbpsetInit[1]; ULONG cProperties = 0; memset(rgdbpInit, 0, sizeof(rgdbpInit)); memset(rgdbpsetInit, 0, sizeof(rgdbpsetInit)); //obtain access to the SQLOLEDB provider hr = ::CoCreateInstance(CLSID_SQLOLEDB, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (LPVOID*)&pidbInitialize); ExitOnFailure(hr, "failed to create IID_IDBInitialize object"); // if there is an instance if (wzInstance && *wzInstance) { hr = StrAllocFormatted(&pwzServerInstance, L"%s\\%s", wzServer, wzInstance); } else { hr = StrAllocString(&pwzServerInstance, wzServer, 0); } ExitOnFailure(hr, "failed to allocate memory for the server instance"); // server[\instance] rgdbpInit[cProperties].dwPropertyID = DBPROP_INIT_DATASOURCE; rgdbpInit[cProperties].dwOptions = DBPROPOPTIONS_REQUIRED; rgdbpInit[cProperties].colid = DB_NULLID; ::VariantInit(&rgdbpInit[cProperties].vValue); rgdbpInit[cProperties].vValue.vt = VT_BSTR; rgdbpInit[cProperties].vValue.bstrVal = ::SysAllocString(pwzServerInstance); ++cProperties; // database rgdbpInit[cProperties].dwPropertyID = DBPROP_INIT_CATALOG; rgdbpInit[cProperties].dwOptions = DBPROPOPTIONS_REQUIRED; rgdbpInit[cProperties].colid = DB_NULLID; ::VariantInit(&rgdbpInit[cProperties].vValue); rgdbpInit[cProperties].vValue.vt = VT_BSTR; rgdbpInit[cProperties].vValue.bstrVal= ::SysAllocString(wzDatabase); ++cProperties; if (fIntegratedAuth) { // username rgdbpInit[cProperties].dwPropertyID = DBPROP_AUTH_INTEGRATED; rgdbpInit[cProperties].dwOptions = DBPROPOPTIONS_REQUIRED; rgdbpInit[cProperties].colid = DB_NULLID; ::VariantInit(&rgdbpInit[cProperties].vValue); rgdbpInit[cProperties].vValue.vt = VT_BSTR; rgdbpInit[cProperties].vValue.bstrVal = ::SysAllocString(L"SSPI"); // default windows authentication ++cProperties; } else { // username rgdbpInit[cProperties].dwPropertyID = DBPROP_AUTH_USERID; rgdbpInit[cProperties].dwOptions = DBPROPOPTIONS_REQUIRED; rgdbpInit[cProperties].colid = DB_NULLID; ::VariantInit(&rgdbpInit[cProperties].vValue); rgdbpInit[cProperties].vValue.vt = VT_BSTR; rgdbpInit[cProperties].vValue.bstrVal = ::SysAllocString(wzUser); ++cProperties; // password rgdbpInit[cProperties].dwPropertyID = DBPROP_AUTH_PASSWORD; rgdbpInit[cProperties].dwOptions = DBPROPOPTIONS_REQUIRED; rgdbpInit[cProperties].colid = DB_NULLID; ::VariantInit(&rgdbpInit[cProperties].vValue); rgdbpInit[cProperties].vValue.vt = VT_BSTR; rgdbpInit[cProperties].vValue.bstrVal = ::SysAllocString(wzPassword); ++cProperties; } // put the properties into a set rgdbpsetInit[0].guidPropertySet = DBPROPSET_DBINIT; rgdbpsetInit[0].rgProperties = rgdbpInit; rgdbpsetInit[0].cProperties = cProperties; // create and set the property set hr = pidbInitialize->QueryInterface(IID_IDBProperties, (LPVOID*)&pidbProperties); ExitOnFailure(hr, "failed to get IID_IDBProperties object"); hr = pidbProperties->SetProperties(1, rgdbpsetInit); ExitOnFailure(hr, "failed to set properties"); //initialize connection to datasource hr = pidbInitialize->Initialize(); ExitOnFailure1(hr, "failed to initialize connection to database: %ls", wzDatabase); hr = pidbInitialize->QueryInterface(IID_IDBCreateSession, (LPVOID*)ppidbSession); LExit: for (; 0 < cProperties; cProperties--) { ::VariantClear(&rgdbpInit[cProperties - 1].vValue); } ReleaseObject(pidbProperties); ReleaseObject(pidbInitialize); ReleaseStr(pwzServerInstance); return hr; }