数据库访问层的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
系统数据库操作采用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;