Exemplo n.º 1
0
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;
}
/////////////////////////////////////////////////////////////////
// myCreateDataSource
//
//	This function creates an OLE DB DataSource object for a
//	provider selected by the user, sets initialization properties
//	for the DataSource, and initializes the DataSource. The
//	function returns a pointer to the DataSource object's
//	IUnknown in *ppUnkDataSource.
//
/////////////////////////////////////////////////////////////////
HRESULT myCreateDataSource
	(
	IUnknown **				ppUnkDataSource
	)
{
	HRESULT					hr;
	IDataInitialize *		pIDataInitialize			= NULL;
	IDBPromptInitialize *	pIDBPromptInitialize		= NULL;
	IDBInitialize *			pIDBInitialize				= NULL;
	CLSID					clsid						= CLSID_MSDASQL;

	// Use the Microsoft Data Links UI to create the DataSource
	// object; this will allow the user to select the provider
	// to connect to and to set the initialization properties
	// for the DataSource object, which will be created by the
	// Data Links UI.
	if( g_dwFlags & USE_PROMPTDATASOURCE )
	{
		// Create the Data Links UI object and obtain the
		// IDBPromptInitialize interface from it
		XCHECK_HR(hr = CoCreateInstance(
					CLSID_DataLinks,				//clsid -- Data Links UI
					NULL,							//pUnkOuter
					CLSCTX_INPROC_SERVER,			//dwClsContext
					IID_IDBPromptInitialize,		//riid
					(void**)&pIDBPromptInitialize	//ppvObj
					));

		// Invoke the Data Links UI to allow the user to select
		// the provider and set initialization properties for
		// the DataSource object that this will create
		XCHECK_HR(hr = pIDBPromptInitialize->PromptDataSource(
					NULL,							//pUnkOuter
					GetDesktopWindow(),				//hWndParent
					DBPROMPTOPTIONS_PROPERTYSHEET,	//dwPromptOptions
					0,								//cSourceTypeFilter
					NULL,							//rgSourceTypeFilter
					NULL,							//pwszszzProviderFilter
					IID_IDBInitialize, 				//riid
					(IUnknown**)&pIDBInitialize		//ppDataSource
					));

		// We've obtained a DataSource object from the Data Links UI. This
		// object has had its initialization properties set, so all we
		// need to do is Initialize it
		XCHECK_HR(hr = pIDBInitialize->Initialize());
	}
	// We are not using the Data Links UI to create the DataSource object.
	// Instead, we will enumerate the providers installed on this system
	// through the OLE DB Enumerator and will allow the user to select
	// the ProgID of the provider for which we will create a DataSource
	// object.
	else
	{
		// Use the OLE DB Enumerator to obtain a rowset of installed providers,
		// then allow the user to select a provider from this rowset
		CHECK_HR(hr = myCreateEnumerator(CLSID_OLEDB_ENUMERATOR, &clsid));

		// We will create the DataSource object through the OLE DB service
		// component IDataInitialize interface, so we need to create an
		// instance of the data initialization object
		XCHECK_HR(hr = CoCreateInstance(
					CLSID_MSDAINITIALIZE,			//clsid -- data initialize
					NULL,							//pUnkOuter
					CLSCTX_INPROC_SERVER,			//dwClsContext
					IID_IDataInitialize,			//riid
					(void**)&pIDataInitialize		//ppvObj
					));

		// Use IDataInitialize::CreateDBInstance to create an uninitialized
		// DataSource object for the chosen provider. By using this service
		// component method, the service component manager can provide
		// additional functionality beyond what is natively supported by the
		// provider if the consumer requests that functionality
		XCHECK_HR(hr = pIDataInitialize->CreateDBInstance(
					clsid,							//clsid -- provider
					NULL,							//pUnkOuter
					CLSCTX_INPROC_SERVER,			//dwClsContext
					NULL,							//pwszReserved
					IID_IDBInitialize,				//riid
					(IUnknown**)&pIDBInitialize		//ppDataSource
					));

		// Initialize the DataSource object by setting any required
		// initialization properties and calling IDBInitialize::Initialize
		CHECK_HR(hr = myDoInitialization(pIDBInitialize));
	}

CLEANUP:
	*ppUnkDataSource = pIDBInitialize;
	if( pIDataInitialize )
		pIDataInitialize->Release();
	if( pIDBPromptInitialize )
		pIDBPromptInitialize->Release();
	return hr;
}