51Testing软件测试论坛

标题: 游戏编程系统3----数据库 [打印本页]

作者: 51testing    时间: 2007-11-23 14:48
标题: 游戏编程系统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[1];
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[10];
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[0];
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[4];

for (i = 0; i < 4; i++)
{
  VariantInit(&InitProperties.vValue);
}

USES_CONVERSION;

// Server Name;
InitProperties[0].colid    = DB_NULLID;
InitProperties[0].dwOptions   = DBPROPOPTIONS_REQUIRED;
InitProperties[0].dwPropertyID  = DBPROP_INIT_DATASOURCE;
InitProperties[0].dwStatus   = 0;
InitProperties[0].vValue.vt   = VT_BSTR;
InitProperties[0].vValue.bstrVal = ::SysAllocString(A2COLE(ip));

// Database Name;
InitProperties[1].colid    = DB_NULLID;
InitProperties[1].dwOptions   = DBPROPOPTIONS_REQUIRED;
InitProperties[1].dwPropertyID  = DBPROP_INIT_CATALOG;
InitProperties[1].dwStatus   = 0;
InitProperties[1].vValue.vt   = VT_BSTR;
InitProperties[1].vValue.bstrVal = ::SysAllocString(A2COLE(db));

// User Name;
InitProperties[2].colid    = DB_NULLID;
InitProperties[2].dwOptions   = DBPROPOPTIONS_REQUIRED;
InitProperties[2].dwPropertyID  = DBPROP_AUTH_USERID;
InitProperties[2].dwStatus   = 0;
InitProperties[2].vValue.vt   = VT_BSTR;
InitProperties[2].vValue.bstrVal = ::SysAllocString(A2COLE(user));

// Password
InitProperties[3].colid    = DB_NULLID;
InitProperties[3].dwOptions   = DBPROPOPTIONS_REQUIRED;
InitProperties[3].dwPropertyID  = DBPROP_AUTH_PASSWORD;
InitProperties[3].dwStatus   = 0;
InitProperties[3].vValue.vt   = VT_BSTR;
InitProperties[3].vValue.bstrVal = ::SysAllocString(A2COLE(pass));

m_rgInitPropSet[0].guidPropertySet = DBPROPSET_DBINIT;
m_rgInitPropSet[0].cProperties  = 4;
m_rgInitPropSet[0].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[MAX_CMD_STR];

ICommandText* m_pICommandText;
IAccessor*  m_pIAccessor;
IRowset*  m_pIRowset;

COLECore*  m_pCore;
HACCESSOR  m_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();
}
}

完蛋,我发现我不善言辞,代码也少有说明.
我发现连我自己都不知道我自己讲的是什么...唉.失败...

小二,上代码!
看不懂也别怪我了...我的语言水平实在有限
不过这个确实好用哈.





欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2