📄 xoledatabase.cpp
字号:
// 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 + -