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

📄 oledbdatabase.cpp

📁 oledb封装类仿MFC的CRecordset
💻 CPP
字号:
#include "StdAfx.h"
#include ".\dbkrnl.h"
LPOLESTR GetSubString(LPCOLESTR pSrc,LPCOLESTR pLable)
{
	LPOLESTR pBegin;
	LPOLESTR pEnd;
	LPOLESTR pDst;
	size_t nLength;
	pBegin=::wcsstr(pSrc,pLable);
	if(!pBegin)
	{
		ATLTRACE(L"参数pConnectString中找不到 %s 字符串标识\n",pLable);
		return NULL;
	}
	pBegin+=::wcslen(pLable);
	while((*pBegin==L'=')||(*pBegin==L' '))
		pBegin++;
	pEnd=::wcschr(pBegin,L';');
	if(!pEnd)
	{
		ATLTRACE(L"参数pConnectString中 %s 字符串标识没有对应的 ; 结束标识\n",pLable);
		return NULL;
	}
	while(*(pEnd-1)==L' ')
		pEnd--;
	nLength=pEnd-pBegin;
	pDst=new WCHAR[nLength+1];
	::wcsncpy(pDst,pBegin,nLength);
	pDst[nLength]=0;
	return pDst;
}

COleDBDatabase::COleDBDatabase(void)
: m_pIDBInitialize(NULL)
{
}

COleDBDatabase::~COleDBDatabase(void)
{
	Close();
}

BOOL COleDBDatabase::Open(LPCOLESTR pSvrAddr, LPCOLESTR pUID, LPCOLESTR pPWD, LPCOLESTR pDatabase, LPCOLESTR pProgID)
{
	_ASSERT(pSvrAddr&&pUID&&pPWD&&pDatabase&&pProgID);
	HRESULT hr;
	CLSID   clsid;
	DBPROP InitProps[6];
	DBPROPSET rgInitPropSet[1];
	IDBProperties* pIDBProperties;
	hr=::CLSIDFromProgID(pProgID, &clsid);
	if(FAILED(hr))
	{
		ATLTRACE(L"ProgID Not Found");
		return FALSE;
	}
#ifdef _DEBUG
	hr=::CoCreateInstance(clsid,NULL,CLSCTX_INPROC,IID_IDBInitialize,(void**)&m_pIDBInitialize);
	if(FAILED(hr))
	{
		ATLTRACE(L"Create IDBInitialize interface failed,Result code is %08X\n",hr);
		return FALSE;
	}
#else
	::CoCreateInstance(clsid,NULL,CLSCTX_INPROC,IID_IDBInitialize,(void**)&m_pIDBInitialize);
#endif
	for(int i=0;i<6;i++)
	{
		::VariantInit(&InitProps[i].vValue);
		InitProps[i].dwOptions=DBPROPOPTIONS_REQUIRED;
		InitProps[i].colid=DB_NULLID;
	}
	//Password
	InitProps[0].dwPropertyID=DBPROP_AUTH_PASSWORD;
	InitProps[0].vValue.vt=VT_BSTR;
	InitProps[0].vValue.bstrVal=::SysAllocString(pPWD);
	//UID
	InitProps[1].dwPropertyID=DBPROP_AUTH_USERID;
	InitProps[1].vValue.vt=VT_BSTR;
	InitProps[1].vValue.bstrVal=::SysAllocString(pUID);
	//CATALOG
	InitProps[2].dwPropertyID=DBPROP_INIT_CATALOG;
	InitProps[2].vValue.vt=VT_BSTR;
	InitProps[2].vValue.bstrVal=::SysAllocString(pDatabase);
	//Sever
	InitProps[3].dwPropertyID=DBPROP_INIT_DATASOURCE;
	InitProps[3].vValue.vt=VT_BSTR;
	InitProps[3].vValue.bstrVal=::SysAllocString(pSvrAddr);
	//DBPROP_INIT_LCID
	InitProps[4].dwPropertyID=DBPROP_INIT_LCID;
	InitProps[4].vValue.vt=VT_I4;
	InitProps[4].vValue.lVal=(long)2052;
	//DBPROP_INIT_PROMPT
	InitProps[5].dwPropertyID=DBPROP_INIT_PROMPT;
	InitProps[5].vValue.vt=VT_I2;
	InitProps[5].vValue.iVal=(short)4;

	rgInitPropSet[0].cProperties=6;
	rgInitPropSet[0].guidPropertySet=DBPROPSET_DBINIT;
	rgInitPropSet[0].rgProperties=InitProps;
	m_pIDBInitialize->QueryInterface(IID_IDBProperties,(void**)&pIDBProperties);
	hr=pIDBProperties->SetProperties(1,rgInitPropSet);
	pIDBProperties->Release();
	for(int i=0;i<4;i++)
		::SysFreeString(InitProps[i].vValue.bstrVal);
	if(FAILED(hr))
	{
		ATLTRACE(L"IDBProperties Interface Call SetProperties Method Failed,Result code is %08X\n",hr);
		m_pIDBInitialize->Release();
		m_pIDBInitialize=NULL;
		return FALSE;
	}
	hr=m_pIDBInitialize->Initialize();
	if(FAILED(hr))
	{
		ATLTRACE(L"DataSource Initialize Failed,Result code is %08X\n",hr);
		m_pIDBInitialize->Release();
		m_pIDBInitialize=NULL;
		return FALSE;
	}
	return TRUE;
}

BOOL COleDBDatabase::Open(LPCOLESTR pConnectString)
{
	_ASSERT(pConnectString);
	LPOLESTR pSvrAddr;
	LPOLESTR pUID;
	LPOLESTR pPWD;
	LPOLESTR pDatabase;
	LPOLESTR pProgID = L"SQLOLEDB.1";
	LPOLESTR pRetProgID;
	BOOL bRet;
	if((pSvrAddr=GetSubString(pConnectString,L"SERVER"))==NULL)
		return FALSE;
	if((pUID=GetSubString(pConnectString,L"UID"))==NULL)
		return FALSE;
	if((pPWD=GetSubString(pConnectString,L"PWD"))==NULL)
		return FALSE;
	if((pDatabase=GetSubString(pConnectString,L"DATABASE"))==NULL)
		return FALSE;
	if((pRetProgID=GetSubString(pConnectString,L"PROGID")))
		pProgID=pRetProgID;
	bRet=Open(pSvrAddr,pUID,pPWD,pDatabase,pProgID);
	delete[] pSvrAddr;
	delete[] pUID;
	delete[] pPWD;
	delete[] pDatabase;
	if(pRetProgID)
		delete[] pRetProgID;

	return bRet;
}

void COleDBDatabase::Close(void)
{
	if(m_pIDBInitialize)
	{
		m_pIDBInitialize->Uninitialize();
		m_pIDBInitialize->Release();
		m_pIDBInitialize=NULL;
	}
}

BOOL COleDBDatabase::ExecuteSQL(LPCOLESTR pSQLStatement)
{
	_ASSERT(pSQLStatement);
	IDBCreateCommand* pIDBCreateCommand=NULL;
	IDBCreateSession* pIDBCreateSession=NULL;
	ICommand* pICommand;
	ICommandText* pICommandText;
	HRESULT hr;
	m_pIDBInitialize->QueryInterface(IID_IDBCreateSession,(void**)&pIDBCreateSession);
	hr=pIDBCreateSession->CreateSession(NULL,IID_IDBCreateCommand,(IUnknown**)&pIDBCreateCommand);
	pIDBCreateSession->Release();
	if (FAILED(hr))
	{
		ATLTRACE(L"IDBCreateSession Interface Call CreateSession Method Failed,Result code is %08X\n",hr);
		return FALSE;
	}
	hr=pIDBCreateCommand->CreateCommand(NULL,IID_ICommand,(IUnknown**)&pICommand);
	pIDBCreateCommand->Release();
	if(FAILED(hr))
	{
		ATLTRACE(L"IDBCreateCommand Interface Call CreateCommand Method Failed,Result code is %08X\n",hr);
		return FALSE;
	}
	pICommand->QueryInterface(IID_ICommandText,(void**)&pICommandText);
	hr=pICommandText->SetCommandText(DBGUID_DBSQL,pSQLStatement);
	if(FAILED(hr))
	{
		ATLTRACE(L"ICommandText Interface Call SetCommandText Method Failed,Result code is %08X\n",hr);
		pICommandText->Release();
		pICommand->Release();
		return FALSE;
	}
	hr=pICommand->Execute(NULL,IID_NULL,NULL,NULL,NULL);
	pICommand->Release();
	pICommandText->Release();
	if(FAILED(hr))
	{
		ATLTRACE(L"Execute Command Text Failed,Result code is %08X\n",hr);
		return FALSE;
	}
	return TRUE;
}

⌨️ 快捷键说明

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