<span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;">【why】文件處理在安全級別和隨機讀取能力以及查詢方便等各方面無法滿足我們的需要,因此我們需要在MFC程序中引入數據庫,引入數據庫常通過ODBC和ADO兩種方式,引入ODBC只需要進行一些基本設置即可,這裏給出ADO的一些基本代碼模板</span>
【how】
1.引入ADO動態鏈接庫
在StdAfx.h中加入
#import "C:\program files\common files\System\ado\msado15.dll" no_namespace \
rename("EOF","adoEOF") \
rename("LockTypeEnum","newLockTypeEnum")\
rename("DataTypeEnum","newDataTypeEnum")\
rename("FieldAttributeEnum","newFieldAttributeEnum")\
rename("EditModeEnum","newEditModeEnum")\
rename("RecordStatusEnum","newRecordStatusEnum")\
rename("ParameterDirectionEnum","newParameterDirectionEnum")
根據機器配置不同,可能會有相應的更改
2.定義智能指針對象
在主類的頭文件的主類中增加兩個成員變量
public:
_RecordsetPtr m_pRs;
private:
_ConnectionPtr m_pConn;
這裏要說明的是
_RecordsetPtr智能指針,它是專門爲通過記錄集操作數據庫而設立的指針,通過該接口可以對數據庫的表內的記錄、字段等進行各種操作。
要搞清楚的是數據庫和ADO的記錄集是兩個不同的概念, 是存在於不同物理位置的兩個存儲空間。 記錄集相當於是實際數據的一份拷貝。 記錄集是相對脫離數據庫而存在的。
3.初始化智能指針
在主類的cpp文件中實現InitInstance函數初始化 這裏以類CGIS爲例
BOOL CGISApp::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
// Create ADO Connection
if( FAILED(::CoInitialize(NULL)) )
{
AfxMessageBox("ADO Init failed");
return false;
}
try
{
m_pConn.CreateInstance(__uuidof(Connection));
m_pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=GIS.mdb","","",adConnectUnspecified);//這裏GIS.mdb是和程序在同一目錄的數據庫
}
// Catch Exceptions
catch(_com_error &e)
{
CString err;
err.Format("%s", (char*)(e.Description()) );
AfxMessageBox(err);
}
catch(...)
{
AfxMessageBox("Unknown Error...");
}
// Init ADO RecordSet
m_pRs.CreateInstance(__uuidof(Recordset));
CGISDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}
注意:
這裏GIS.mdb是和程序在同一目錄的數據庫
4.統一接口ADOExecute的實現
依舊以類CGIS爲例,在頭文件的類中定義成員函數
bool ADOExecute(_RecordsetPtr &ADOSet, _variant_t &strSQL);
然後在cpp文件中實現該函數
bool CGISApp::ADOExecute(_RecordsetPtr &ADOSet, _variant_t &strSQL)
{
if ( ADOSet->State == adStateOpen)
ADOSet->Close();
try
{
ADOSet->Open(strSQL, m_pConn.GetInterfacePtr(), adOpenStatic, adLockOptimistic, adCmdUnknown);
return true;
}
catch(_com_error &e)
{
CString err;
err.Format("ADO Error: %s",(char*)e.Description());
AfxMessageBox(err);
return false;
}
}
至此,ADO數據庫就成功引入程序中,每次使用時調用主類實例的ADOExecute 傳入的參數爲智能指針和sql語句 m_prs即指向記錄集
【postscript】
這裏給出一個大牛的相關文章 內容更加豐富
http://blog.csdn.net/fengzhishang2019/article/details/7890041