游戏编程系统3----数据库
windows下面 做游戏,还是老老实实用mssqlserver吧.最新的sqlserver 2005性能提高很多了.而且有了SQL Server Management Studio.爽.
介绍一个SQLOLEDB通过存储过程的实现吧.代码实际上是我用韩国***游戏服务端改出来了.
和SQL连接的方式很多,OLEDB是我觉得功能最强大的.
定义基类
COLECore
class COLECore
{
public:
COLECore();
~COLECore();
HRESULT SDKGetDataSource();
HRESULT InitConnection(char* ip, char* db, char* user, char* pass);
bool Clear();
HRESULT ResultProc();
HRESULT SetCommandText(ICommandText* pICommandText, WCHAR* wCmdString);
HRESULT Execute();
HRESULT TestFunction();
IDBCreateCommand*GetCreateCommand() { return m_pIDBCreateCommand; }
HRESULT InitParameters();
IDBInitialize* m_pIDBInitialize;
IDBProperties* m_pIDBProperties;
IDBCreateSession*m_pIDBCreateSession;
IDBCreateCommand*m_pIDBCreateCommand;
ITransactionLocal*m_pITransaction;
ICommandText* m_pICommandText;
IRowset* m_pIRowset;
IColumnsInfo* m_pIColumnsInfo;
DBCOLUMNINFO* m_pDBColumnInfo;
IAccessor* m_pIAccessor;
DBPROPSET m_rgInitPropSet;
ULONG m_i, m_j;
LONG m_cNumRows;
ULONG m_lNumCols;
WCHAR* m_pStringsBuffer;
DBBINDING* m_pBindings;
ULONG m_ConsumerBufColOffset;
HACCESSOR m_hAccessor;
HROW m_hRows;
HROW* m_pRows;
BYTE* m_pBuffer;
};
实现
CLSID CLSID_SQLOLEDB = {0xc7ff16cL,0x38e3,0x11d0,{0x97,0xab,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
COLECore::COLECore()
{
m_cNumRows = 0;
m_ConsumerBufColOffset = 0;
m_pRows = &m_hRows;
m_pIAccessor = NULL;
m_pICommandText = NULL;
m_pIDBCreateCommand = NULL;
m_pIDBCreateSession = NULL;
m_pIDBInitialize = NULL;
}
COLECore::~COLECore()
{
}
HRESULT COLECore::SDKGetDataSource()
{
return S_OK;
}
HRESULT COLECore::InitConnection(char* ip, char* db, char* user, char* pass)
{
HRESULT hr;
int i = 0;
CoInitialize(NULL);
hr = CoCreateInstance(
CLSID_SQLOLEDB,
NULL,
CLSCTX_INPROC_SERVER,
IID_IDBInitialize,
(void**)&m_pIDBInitialize);
if (FAILED(hr))
{
return E_FAIL;
}
DBPROP InitProperties;
for (i = 0; i < 4; i++)
{
VariantInit(&InitProperties.vValue);
}
USES_CONVERSION;
// Server Name;
InitProperties.colid = DB_NULLID;
InitProperties.dwOptions = DBPROPOPTIONS_REQUIRED;
InitProperties.dwPropertyID= DBPROP_INIT_DATASOURCE;
InitProperties.dwStatus = 0;
InitProperties.vValue.vt = VT_BSTR;
InitProperties.vValue.bstrVal = ::SysAllocString(A2COLE(ip));
// Database Name;
InitProperties.colid = DB_NULLID;
InitProperties.dwOptions = DBPROPOPTIONS_REQUIRED;
InitProperties.dwPropertyID= DBPROP_INIT_CATALOG;
InitProperties.dwStatus = 0;
InitProperties.vValue.vt = VT_BSTR;
InitProperties.vValue.bstrVal = ::SysAllocString(A2COLE(db));
// User Name;
InitProperties.colid = DB_NULLID;
InitProperties.dwOptions = DBPROPOPTIONS_REQUIRED;
InitProperties.dwPropertyID= DBPROP_AUTH_USERID;
InitProperties.dwStatus = 0;
InitProperties.vValue.vt = VT_BSTR;
InitProperties.vValue.bstrVal = ::SysAllocString(A2COLE(user));
// Password
InitProperties.colid = DB_NULLID;
InitProperties.dwOptions = DBPROPOPTIONS_REQUIRED;
InitProperties.dwPropertyID= DBPROP_AUTH_PASSWORD;
InitProperties.dwStatus = 0;
InitProperties.vValue.vt = VT_BSTR;
InitProperties.vValue.bstrVal = ::SysAllocString(A2COLE(pass));
m_rgInitPropSet.guidPropertySet = DBPROPSET_DBINIT;
m_rgInitPropSet.cProperties= 4;
m_rgInitPropSet.rgProperties= InitProperties;
hr = m_pIDBInitialize->QueryInterface(
IID_IDBProperties,
(void**)&m_pIDBProperties);
if (FAILED(hr))
{
return E_FAIL;
}
hr = m_pIDBProperties->SetProperties(1, m_rgInitPropSet);
if (FAILED(hr))
{
return E_FAIL;
}
m_pIDBProperties->Release();
if (FAILED(m_pIDBInitialize->Initialize()))
{
return E_FAIL;
}
// Create Session
if (FAILED(m_pIDBInitialize->QueryInterface(
IID_IDBCreateSession,
(void**)&m_pIDBCreateSession)))
{
return E_FAIL;
}
if (FAILED(m_pIDBCreateSession->CreateSession(
NULL,
IID_IDBCreateCommand,
(IUnknown**)&m_pIDBCreateCommand)))
{
return E_FAIL;
}
if (FAILED(m_pIDBCreateCommand->CreateCommand(
NULL,
IID_ICommandText,
(IUnknown**)&m_pICommandText)))
{
return E_FAIL;
}
return S_OK;
}
HRESULT COLECore::SetCommandText(ICommandText* pICommandText, WCHAR* wCmdString)
{
if (pICommandText == NULL)
{
return E_FAIL;
}
if (FAILED(pICommandText->SetCommandText(DBGUID_DBSQL, wCmdString)))
{
return E_FAIL;
}
return S_OK;
}
HRESULT COLECore::Execute()
{
if (FAILED(m_pICommandText->Execute(
NULL,
IID_IRowset,
NULL,
&m_cNumRows,
(IUnknown**)&m_pIRowset)))
{
return E_FAIL;
}
return S_OK;
}
HRESULT COLECore::ResultProc()
{
m_ConsumerBufColOffset = 0;
HRESULT hr;
if (m_pIRowset == NULL)
{
return E_FAIL;
}
hr = m_pIRowset->QueryInterface(
IID_IColumnsInfo,
(void**)&m_pIColumnsInfo);
if (FAILED(hr))
{
return E_FAIL;
}
m_pIColumnsInfo->GetColumnInfo(
&m_lNumCols,
&m_pDBColumnInfo,
&m_pStringsBuffer);
m_pIColumnsInfo->Release();
return S_OK;
}
bool COLECore::Clear()
{
if (m_pIAccessor != NULL)
{
m_pIAccessor->Release();
}
if (m_pICommandText != NULL)
{
m_pICommandText->Release();
}
if (m_pIDBCreateCommand != NULL)
{
m_pIDBCreateCommand->Release();
}
if (m_pIDBCreateSession != NULL)
{
m_pIDBCreateSession->Release();
}
if (m_pIDBInitialize != NULL)
{
if (FAILED(m_pIDBInitialize->Uninitialize()))
{
return false;
}
m_pIDBInitialize->Release();
}
CoUninitialize();
return true;
}
HRESULT COLECore::InitParameters()
{
return S_OK;
}
定义COLEWorker类和子类COLEInput,COLEOutput
#define MAX_CMD_STR 256
class COLEWorker
{
public:
COLEWorker();
~COLEWorker();
WCHAR m_wCmdString;
ICommandText* m_pICommandText;
IAccessor*m_pIAccessor;
IRowset*m_pIRowset;
COLECore*m_pCore;
HACCESSORm_hAccessor;
HRESULT Init(COLECore* pCore, WCHAR* wCmdString);
virtual HRESULT CreateAccessor() { return S_OK; }
virtual void Release();
};
class COLEInput : public COLEWorker
{
public:
COLEInput();
~COLEInput();
};
class COLEOutput : public COLEWorker
{
public:
HACCESSOR m_hRowAccessor;
COLEOutput();
~COLEOutput();
virtual void Release();
};
实现
COLEWorker::COLEWorker()
{
//
}
COLEWorker::~COLEWorker()
{
//
}
void COLEWorker::Release()
{
if (m_pIAccessor != NULL)
{
m_pIAccessor->ReleaseAccessor(m_hAccessor, NULL);
m_pIAccessor->Release();
}
if (m_pIRowset != NULL)
{
m_pIRowset->Release();
}
}
HRESULT COLEWorker::Init(COLECore* pCore, WCHAR* wCmdString)
{
if (pCore == NULL)
{
return E_FAIL;
}
wcscpy_s(m_wCmdString, MAX_CMD_STR, wCmdString);
m_pCore = pCore;
if (FAILED((pCore->GetCreateCommand())->CreateCommand(
NULL,
IID_ICommandText,
(IUnknown**)&m_pICommandText)))
{
return E_FAIL;
}
if (S_OK != m_pCore->SetCommandText(m_pICommandText, wCmdString))
{
return E_FAIL;
}
return CreateAccessor();
}
COLEInput::COLEInput()
{
COLEWorker::COLEWorker();
}
COLEInput::~COLEInput()
{
COLEWorker::~COLEWorker();
}
COLEOutput::COLEOutput()
{
COLEWorker::COLEWorker();
}
COLEOutput::~COLEOutput()
{
COLEWorker::~COLEWorker();
}
void COLEOutput::Release()
{
if (m_pIAccessor != NULL)
{
m_pIAccessor->ReleaseAccessor(m_hAccessor, NULL);
m_pIAccessor->ReleaseAccessor(m_hRowAccessor, NULL);
m_pIAccessor->Release();
}
if (m_pIRowset != NULL)
{
m_pIRowset->Release();
}
}
完蛋,我发现我不善言辞,代码也少有说明.
我发现连我自己都不知道我自己讲的是什么...唉.失败...
小二,上代码!
看不懂也别怪我了...我的语言水平实在有限
不过这个确实好用哈.
页:
[1]