⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xoledatabase.cpp

📁 数据库访问原代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// XOleDatabase.cpp: implementation of the COleDatabase class

#include "stdafx.h"
#include "XOleDatabase.h"
#include "XOleStrVariant.h"


// Basic Function
#define StrToWStr(s, d, n)  MultiByteToWideChar(CP_ACP, 0, s, -1, d, n)
#define WStrToStr(s, d, n)  WideCharToMultiByte(CP_ACP, 0, s, -1, d, n, NULL, NULL) 


//////////////////////////////////////////////////////
// Class XOleDatabase								//
//////////////////////////////////////////////////////

HRESULT XOleDatabase::OpenDatabase(LPCTSTR lpConnect)
{
	HRESULT  hr;
	WCHAR    lpBuffer[2048];
	XComPtr<IDataInitialize>  dbDataInit;

	// If open, close database
	CloseDatabase();

	// Convert connect string
	StrToWStr(lpConnect, lpBuffer, 2048);
	hr = CoCreateInstance( CLSID_MSDAINITIALIZE, NULL, 
						   CLSCTX_INPROC_SERVER, 
						   IID_IDataInitialize, 
						   (void **) &dbDataInit ); 
	if(hr != S_OK)   return hr;

	hr = dbDataInit->GetDataSource( NULL, 
				CLSCTX_INPROC_SERVER, lpBuffer,
			IID_IDBInitialize, (IUnknown **) &m_dbInit );
	if(hr != S_OK)   return hr;

	// Initialize the Datasource
	hr = m_dbInit->Initialize();
	if(hr != S_OK)   return hr;

	// Create session
	hr = m_dbInit.QueryInterface(IID_IDBCreateSession, &m_dbSession);
	return hr;
}

HRESULT XOleDatabase::OpenDatabase( LPCTSTR  lpDriver, 
									LPCTSTR  lpDBName, 
									LPCTSTR  lpUserID, 
									LPCTSTR  lpUserKey 
								   )
{
	HRESULT  hr;
	CLSID    rfDriver;
	WCHAR    lpBuffer[256];

	StrToWStr(lpDriver, lpBuffer, 256);
	hr = CLSIDFromProgID(lpBuffer, &rfDriver);
	if(hr != S_OK)   return  hr;

	return OpenDatabase(rfDriver, lpDBName, lpUserID, lpUserKey);
}

HRESULT XOleDatabase::OpenDatabase( REFCLSID  rfDriver, 
									LPCTSTR   lpDBName, 
									LPCTSTR   lpUserID, 
									LPCTSTR   lpUserKey
								   )
{
	HRESULT    hr;
	DBPROP     lpProp[5];
	DBPROPSET  dbPropSet;
	WCHAR      lpBuffer[256];
	XComPtr<IDBProperties>  dbPropert;

	// If open, close database
	CloseDatabase();

	// Create IDBInitialize interface
	hr = CoCreateInstance( rfDriver, NULL, 
						   CLSCTX_INPROC_SERVER, 
						   IID_IDBInitialize, 
						   (void **) &m_dbInit  );
	if(hr != S_OK)   return hr;

	for(int i = 0; i < 5; i ++) 
	{
		lpProp[i].colid = DB_NULLID;
		lpProp[i].dwOptions = DBPROPOPTIONS_REQUIRED;
	}

	// Prompt information
	lpProp[0].vValue.vt = VT_I2;
	lpProp[0].vValue.iVal = DBPROMPT_NOPROMPT;
	lpProp[0].dwPropertyID = DBPROP_INIT_PROMPT;

	// Read write Mode
	lpProp[1].vValue.vt = VT_I4;
	lpProp[1].vValue.lVal = 0x03;
	lpProp[1].dwPropertyID = DBPROP_INIT_MODE;

	// Database name
	lpProp[2].vValue.vt = VT_BSTR;
	StrToWStr(lpDBName, lpBuffer, 256);
	lpProp[2].dwPropertyID = DBPROP_INIT_DATASOURCE;
	lpProp[2].vValue.bstrVal = SysAllocString(lpBuffer);

	// User ID
	lpProp[3].vValue.vt = VT_BSTR;
	StrToWStr(lpUserID, lpBuffer, 256);
	lpProp[3].dwPropertyID = DBPROP_AUTH_USERID;
	lpProp[3].vValue.bstrVal = SysAllocString(lpBuffer);

	// User password
	lpProp[4].vValue.vt = VT_BSTR;
	StrToWStr(lpUserKey, lpBuffer, 256);
	lpProp[4].dwPropertyID = DBPROP_AUTH_PASSWORD;
	lpProp[4].vValue.bstrVal = SysAllocString(lpBuffer);
	
	dbPropSet.cProperties = 5;
	dbPropSet.rgProperties = lpProp;
	dbPropSet.guidPropertySet = DBPROPSET_DBINIT;

	hr = m_dbInit.QueryInterface(IID_IDBProperties, &dbPropert);
	if(hr != S_OK)   return hr;

	hr = dbPropert->SetProperties(1, &dbPropSet);
	if(hr != S_OK)   return hr;

	hr = m_dbInit->Initialize();
	if(hr != S_OK)   return hr;

	// Create session
	hr = m_dbInit.QueryInterface(IID_IDBCreateSession, &m_dbSession);
	return hr;
}

void XOleDatabase::CloseDatabase() 
{
	m_dbInit.Release();
	m_dbSession.Release();
}

HRESULT XOleDatabase::ExecuteCommand(LPCTSTR strQuery, long *lpAffect)
{
	HRESULT   hr;
	WCHAR     lpBuffer[512];
	XComPtr<ICommand>        dbCommand;
	XComPtr<ICommandText>    dbCmdText;
	XComPtr<IDBCreateCommand>  dbCreateCmd; 

	// Create create command
	hr = m_dbSession->CreateSession( NULL, 
						IID_IDBCreateCommand, 
						(IUnknown **) &dbCreateCmd );
	if(hr != S_OK)   return hr;

	// Create command
	hr = dbCreateCmd->CreateCommand( NULL, IID_ICommand, 
					(IUnknown **) &dbCommand );
	if(hr != S_OK)   return hr;

	// Create command text
	hr = dbCommand.QueryInterface(IID_ICommandText, &dbCmdText);
	if(hr != S_OK)   return hr;

	StrToWStr(strQuery, lpBuffer, 512);
	hr = dbCmdText->SetCommandText(DBGUID_DBSQL, lpBuffer);
	if(hr != S_OK)   return hr;

	// Execute command
	hr = dbCommand->Execute(NULL, IID_NULL, NULL, lpAffect, NULL);
	return  hr;
}

HRESULT XOleDatabase::IsQueryExist(LPCTSTR strQuery)
{
	HRESULT   hr;
	WCHAR     lpBuffer[512];
	XComPtr<IRowset>     dbRowset;
	XComPtr<ICommand>    dbCommand;
	XComPtr<ICommandText>    dbCmdText;
	XComPtr<IDBCreateCommand>  dbCreateCmd; 

	// Create create command
	hr = m_dbSession->CreateSession( NULL, 
						IID_IDBCreateCommand, 
						(IUnknown **) &dbCreateCmd );
	if(hr != S_OK)   return hr;

	// Create command
	hr = dbCreateCmd->CreateCommand( NULL, IID_ICommand, 
					(IUnknown **) &dbCommand );
	if(hr != S_OK)   return hr;

	// Create command text
	hr = dbCommand.QueryInterface(IID_ICommandText, &dbCmdText);
	if(hr != S_OK)   return hr;

	StrToWStr(strQuery, lpBuffer, 512);
	hr = dbCmdText->SetCommandText(DBGUID_DBSQL, lpBuffer);
	if(hr != S_OK)   return hr;

	// Execute command
	hr = dbCommand->Execute( NULL, IID_IRowset, 
				NULL, NULL, (IUnknown **) &dbRowset );
	if(hr != S_OK)  return hr;

	// Whether is existing
	hr = dbRowset->RestartPosition(NULL);
	if(hr != S_OK)  return hr;

	// Now determind 
	DWORD  dwCount;
	HROW   hRow, *lpRow = &hRow;
	hr = dbRowset->GetNextRows(NULL, 0, 1, &dwCount, &lpRow);
	if(hr != S_OK)  return hr;

	// Release row and return
	dbRowset->ReleaseRows(1, lpRow, NULL, NULL, NULL);
	if(dwCount == 1)   return S_OK;	
	return S_FALSE;
}

HRESULT XOleDatabase::GetSchemaRowset(LPCTSTR strType, XOleRowset *lpRowset)
{
	HRESULT    hr;
	WCHAR      lpBuffer[256];
	VARIANT    lpRestrict[4];

	IRowset  *lpIRowset;
	XComPtr<IOpenRowset>  dbOpenSet;
	XComPtr<IDBSchemaRowset>  dbSchema;

	// Create IOpenRowset interface
	hr = m_dbSession->CreateSession( NULL, IID_IOpenRowset, 
							(IUnknown **) &dbOpenSet );
	if(hr != S_OK)   return hr;

	// Create ISchemaRowset interface
	hr = dbOpenSet.QueryInterface(IID_IDBSchemaRowset, &dbSchema);
	if(hr != S_OK)   return hr;

	// Search schema rowset
	VariantInit(lpRestrict);
	VariantInit(lpRestrict + 1);
	VariantInit(lpRestrict + 2);

	lpRestrict[3].vt = VT_BSTR;
	StrToWStr(strType, lpBuffer, 256);
	lpRestrict[3].bstrVal = SysAllocString(lpBuffer);

	hr = dbSchema->GetRowset( NULL, DBSCHEMA_TABLES, 
							4, lpRestrict, IID_IRowset, 0, 
							NULL, (IUnknown **) &lpIRowset );
	if(hr != S_OK)  return hr;

	hr = lpRowset->Create(lpIRowset);
	lpIRowset->Release();

	return hr;
}

HRESULT XOleDatabase::OpenRowset( LPCTSTR     strTable, 
								  IRowset   **ppRowset, 
								  BOOL        bCanModify
								 )
{
	HRESULT    hr;
	DWORD      nCount;
	DBPROP     lpProp[4];
	DBPROPSET  dbPropSet;
	WCHAR      lpBuffer[64];
	XComPtr<IOpenRowset>  dbOpenSet; 

	// Create open rowset
	hr = m_dbSession->CreateSession( NULL, IID_IOpenRowset, 
							(IUnknown **) &dbOpenSet );
	if(hr != S_OK)   return hr;

	// Can scroll back
	lpProp[0].colid = DB_NULLID;
	lpProp[0].vValue.vt = VT_BOOL;
	lpProp[0].vValue.boolVal = VARIANT_TRUE;
	lpProp[0].dwOptions = DBPROPOPTIONS_REQUIRED;
	lpProp[0].dwPropertyID = DBPROP_CANSCROLLBACKWARDS;

	// If can be modified
	nCount = 1;
	if( bCanModify )
	{
		nCount = 3;

		// Change information
		lpProp[1].colid = DB_NULLID;
		lpProp[1].vValue.vt = VT_BOOL;
		lpProp[1].vValue.boolVal = VARIANT_TRUE;
		lpProp[1].dwOptions = DBPROPOPTIONS_REQUIRED;
		lpProp[1].dwPropertyID = DBPROP_IRowsetChange;

		// Update information
		lpProp[2].colid = DB_NULLID;
		lpProp[2].vValue.vt = VT_I4;
		lpProp[2].vValue.lVal = DBPROPVAL_UP_INSERT | 
								DBPROPVAL_UP_CHANGE | 
								DBPROPVAL_UP_DELETE; 
		lpProp[2].dwOptions = DBPROPOPTIONS_REQUIRED;
		lpProp[2].dwPropertyID = DBPROP_UPDATABILITY;
	}

	dbPropSet.cProperties = nCount;
	dbPropSet.rgProperties = lpProp;
	dbPropSet.guidPropertySet = DBPROPSET_ROWSET;

	// Table name
	StrToWStr(strTable, lpBuffer, 64);

	// Open the rowset
	DBID  myTable;
	myTable.eKind = DBKIND_NAME;
	myTable.uName.pwszName = lpBuffer;
	hr = dbOpenSet->OpenRowset( NULL, &myTable, NULL, 
						  IID_IRowset, 1, &dbPropSet,
						  (IUnknown **) ppRowset  );
	return hr;
}

// 查询数据库记录
HRESULT XOleDatabase::QueryRowset( LPCTSTR    strQuery, 
								   IRowset   **ppRowset, 
								   BOOL       bCanModify
								 )
{
	HRESULT    hr;
	DWORD      nCount;
	DBPROP     lpProp[4];
	DBPROPSET  dbPropSet;
	WCHAR      lpBuffer[512];

	XComPtr<ICommand>  dbCommand;
	XComPtr<ICommandText>  dbCmdText;
	XComPtr<IDBCreateCommand>  dbCreateCmd; 
	XComPtr<ICommandProperties>  dbCmdPropt;

	// Create create command
	hr = m_dbSession->CreateSession( NULL, 
						IID_IDBCreateCommand, 
						(IUnknown **) &dbCreateCmd );
	if(hr != S_OK)   return hr;

	// Create command
	hr = dbCreateCmd->CreateCommand( NULL, IID_ICommand, 
						(IUnknown **) &dbCommand );
	if(hr != S_OK)   return hr;

	// Set Rowset property
	hr = dbCommand.QueryInterface( 
			IID_ICommandProperties, &dbCmdPropt );
	if(hr != S_OK)   return hr;

	// Can scroll back
	lpProp[0].colid = DB_NULLID;
	lpProp[0].vValue.vt = VT_BOOL;
	lpProp[0].vValue.boolVal = VARIANT_TRUE;
	lpProp[0].dwOptions = DBPROPOPTIONS_REQUIRED;
	lpProp[0].dwPropertyID = DBPROP_CANSCROLLBACKWARDS;

	// If can be modified
	nCount = 1;
	if( bCanModify )
	{
		nCount = 3;

		// Change information
		lpProp[1].colid = DB_NULLID;
		lpProp[1].vValue.vt = VT_BOOL;
		lpProp[1].vValue.boolVal = VARIANT_TRUE;
		lpProp[1].dwOptions = DBPROPOPTIONS_REQUIRED;
		lpProp[1].dwPropertyID = DBPROP_IRowsetChange;

		// Update information
		lpProp[2].colid = DB_NULLID;
		lpProp[2].vValue.vt = VT_I4;
		lpProp[2].vValue.lVal = DBPROPVAL_UP_INSERT | 
								DBPROPVAL_UP_CHANGE | 
								DBPROPVAL_UP_DELETE; 
		lpProp[2].dwOptions = DBPROPOPTIONS_REQUIRED;
		lpProp[2].dwPropertyID = DBPROP_UPDATABILITY;
	}

	dbPropSet.cProperties = nCount;
	dbPropSet.rgProperties = lpProp;
	dbPropSet.guidPropertySet = DBPROPSET_ROWSET;

	// Set properties
	hr = dbCmdPropt->SetProperties(1, &dbPropSet);
	if(hr != S_OK)   return hr;

	// Create command text
	hr = dbCommand.QueryInterface(IID_ICommandText, &dbCmdText);
	if(hr != S_OK)   return hr;

	StrToWStr(strQuery, lpBuffer, 512);
	hr = dbCmdText->SetCommandText(DBGUID_DBSQL, lpBuffer);
	if(hr != S_OK)   return hr;

	// Execute command
	hr = dbCommand->Execute( NULL, IID_IRowset, 
				NULL, NULL, (IUnknown **)ppRowset );

	return hr;
}

HRESULT XOleDatabase::QueryRowset( LPCTSTR      strQuery, 
								   XOleRowset  *lpRowset, 
								   BOOL        bCanModify
								  )
{
	HRESULT  hr;
	IRowset  *lpIRowset;

	hr = QueryRowset(strQuery, &lpIRowset, bCanModify);
	if(hr != S_OK)   return hr;

	hr = lpRowset->Create(lpIRowset);
	lpIRowset->Release();
	return hr;
}


//////////////////////////////////////////////////////
// Class XOleRowset									//
//////////////////////////////////////////////////////

XOleRowset::XOleRowset()
{
	m_nColumn = 0;
	m_hRow = NULL;
	m_lpMalloc = NULL;
	m_lpBuffer = NULL;
	m_hAccessor = NULL;
}

void XOleRowset::ReleaseRowset()
{
	// Release interface
	ReleaseRow();
	m_dbRowset.Release();
	m_dbChange.Release();
	m_dbAccessor.Release();

	// Init variant
	m_nColumn = 0;
	m_hRow = NULL;
	m_lpBuffer = NULL;
	m_hAccessor = NULL;

	// Delete buffer
	if(m_lpMalloc != NULL)
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -