系统数据库操作采用ADO技术,在进行代码设计时,把数据库操作的代码单独写在一个自定义的ado.cpp文件里,包括CADODatabase和CADORecordset两个类分别实现对数据库和记录集的操作,并将这些操作封装在两个类中。
(1)引入ado库
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "adoEOF"),rename("BOF","adoBOF")
(2)用_ConnectionPtr对象连接数据库
连接数据库操作中LPCTSTR lpstrConnection作为输入参数,在lpstrConnection参数中设置驱动driver={SQL Server},数据源(本地) Server=127.0.0.1,数据库名称DATABASE=QUEStoreDB,数据库用户名UID,数据库用户密码PWD。
运用_ConnectionPtr连接数据源。
主要代码如下:
BOOL CADODatabase::Open(LPCTSTR lpstrConnection)
{
HRESULT hr = S_OK;
if(IsOpen())
Close();
if(strcmp(lpstrConnection, _T("")) != 0)
m_strConnection = lpstrConnection;
ASSERT(!m_strConnection.IsEmpty());
try
{
hr = m_pConnection->Open(_bstr_t(m_strConnection), "", "", NULL);
return hr == S_OK;
}
catch(_com_error &e)
{
dump_com_error(e);
}
return FALSE;
}
(3)用_ConnectionPtr对象执行指令
当对数据库进行插入、删除、更新操作时用此方法。
String sql为输入参数,传入SQL(Insert,Delete,Update)语句。
主要代码如下:
BOOL CADODatabase::Execute(LPCTSTR lpstrExec)
{
ASSERT(m_pConnection != NULL);
ASSERT(strcmp(lpstrExec, _T("")) != 0);
try
{
m_pConnection->Execute(_bstr_t(lpstrExec), NULL, adExecuteNoRecords);
}
catch(_com_error &e)
{
dump_com_error(e);
}
return TRUE;
}
(4)使用_RecordsetPtr对象返回记录集
使用数据记录集指针_RecordsetPtr来实现ADO数据操作。
lpstrExec为输入参数,传入SQL(Select)语句;通过_RecordsetPtr对象的操作提取记录集。
主要代码如下:
BOOL CADORecordset::Open(_ConnectionPtr mpdb, LPCTSTR lpstrExec, int nOption)
{
if (IsOpen()) Close();
if(strcmp(lpstrExec, _T("")) != 0)
m_strQuery = lpstrExec;
ASSERT(!m_strQuery.IsEmpty());
m_strQuery.TrimLeft();
BOOL bIsSelect = m_strQuery.Mid(0, strlen("Select ")).CompareNoCase("select ") == 0;
try
{
m_pRecordset->CursorLocation = adUseClient;
if(bIsSelect || nOption == openQuery)
m_pRecordset->Open((LPCSTR)m_strQuery,
_variant_t((IDispatch*)mpdb, TRUE),
adOpenStatic, adLockOptimistic, adCmdText);
else if(nOption == openTable)
m_pRecordset->Open((LPCSTR)m_strQuery,
_variant_t((IDispatch*)mpdb, TRUE),
adOpenDynamic, adLockOptimistic, adCmdTable);
else if(nOption == openStoredProc)
{
m_pRecordset->Open((LPCSTR)m_strQuery,
_variant_t((IDispatch*)mpdb, TRUE),
adOpenStatic, adLockOptimistic, adCmdStoredProc);
}
else
{
TRACE( "Unknown parameter. %d", nOption);
return FALSE;
}
}
catch(_com_error &e)
{
dump_com_error(e);
return FALSE;
}
return m_pRecordset != NULL;
}
(5)使用_RecordsetPtr对象逐个取出数据
当对数据库进行读取某一数据操作时选用此方法,区别于控件的大段数据源绑定。
LPCTSTR lpFieldName为输入参数,传入字段名;CString& strValue为输出参数,传出字段内容。
主要代码如下:
BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, CString& strValue)
{
CString str = _T("");
_variant_t vtFld;
try
{
vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
switch(vtFld.vt)
{
case VT_BSTR:
str = vtFld.bstrVal;
break;
case VT_I4:
str = IntToStr(vtFld.iVal);
break;
case VT_DATE:
{
COleDateTime dt(vtFld);
str = dt.Format("%Y-%m-%d %H:%M:%S");
}
break;
case VT_EMPTY:
case VT_NULL:
break;
default:
strValue.Empty();
return FALSE;
}
strValue = str;
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
strValue= _T("");
return FALSE;
}
}
(6)关闭数据库
在所有数据操作结束后,关闭数据库。
void CADODatabase::Close()
{
try
{ if (IsOpen())
m_pConnection->Close();
}
catch (_com_error e)
{
dump_com_error(e);
}
}。