数据库访问层的实现

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档