?? oledbdatabase.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 + -