VS2013 MFC連線Access資料庫(ADO)詳細版例項操作(含Combo Box讀取資料庫內容,附原始碼)
話不多說,先上圖,如果你需要的是這樣的程式,那麼可以下載下來看一看,帖子裡也會附上比較具體的操作步驟:
先附上下載地址:程式下載地址 程式已經經過VS 2013+Windows 7+Access 2003的測試(執行出現其他問題應該多為環境問題,解決辦法各位可以自行百度)
具體的操作步驟:
Step1:
首先新建一個基於對話方塊的MFC程式,我們封裝一個專門用於資料庫連線的類(不放在頁面裡是為了程式碼的清晰以及後期維護的方便):
注意:很多人願意用connect來取名字,雖然這樣我們封裝類的時候不會有任何問題,但是後面進行資料庫操作的時候就會報錯,各位一定要避免使用此類關鍵字作為你得類名:
Step2:
我們需要匯入ADO連線的系統檔案,同時宣告結果集:
首先是匯入檔案,我這裡使用的是相對路徑,推薦使用相對路徑,這樣不會出現後期因為系統(版本和位數)不一致造成的各種錯誤,程式碼:
#import "msado15.dll" no_namespace rename("EOF", "adoEOF")
相對路徑需要將系統的這個檔案複製到原始檔的路徑下(後面的資料庫檔案也一樣,後面不再過多敘述):
如果各位想用絕對路徑也可以,注意,如果使用絕對路徑需要區分你的系統的位數,程式碼:
win32位系統:
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
win64位系統(Debug時也需要選擇成X64):
#import "C:\Program Files (x86)\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
完成後應該是這樣的(注意!是在標頭檔案匯入)
Step3:
依舊是在標頭檔案中的Public中宣告結果集:
_ConnectionPtr m_pConnection;//連線access資料庫的連結物件
_RecordsetPtr m_pRecordset;//結果集物件
完成後應該是這樣的:
(匯入後可能出現系統無法識別的問題,出現紅色下劃線,這時候我們可以等待一會或者儲存專案重啟VS2013即可消除錯誤提示)
Step4:
首先我們要新建一個Access資料庫,這裡要主要Access資料庫的檔案版本有兩種(類似於Doc和Docx),在連線資料庫時要注意!
1.2007版本以前的access檔案擴充套件民是mdb(本程式使用!)
2 2007版本以後的access副檔名是accdb
注:MFC連線Access資料庫後在別的機器上執行時不需要安裝Access的,這樣讓資料庫的使用可以更寬泛,同時這一連線模式可以相容(Win XP—Win 10的所有系統版本)
進行資料庫連線,這裡我們需要在資料庫連線類裡新增初始化函式(如果是直接放到主介面中,直接將連線程式碼放入初始化函式中即可)這裡演示封裝連線類的做法,首先新建初始化函式:
然後在初始化函式中編輯連線程式碼:
try{
CoInitialize(NULL);
m_pConnection = _ConnectionPtr(__uuidof(Connection));
m_pConnection->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=mfc_access.mdb;";
m_pConnection->Open("", "", "", adConnectUnspecified);
}
catch (_com_error e){
AfxMessageBox(_T("資料庫連線失敗!"));
return FALSE;
}
這時我們可以進行一次Debug,如果程式正常執行,不報錯,說明我們的資料庫已經連線成功了
Step5:
資料庫連線成功後,我們新增一個List Contrl控制元件來顯示查詢內容(具體使用讀者可以百度,避免本文過於冗長,這裡只介紹幾個關鍵值的設定):
Step6:
進行資料庫的相應操作(增、刪、改、查),首先是查詢操作:
try
{
_variant_t RecordsAffected;
cmd.m_pRecordset.CreateInstance(__uuidof(Recordset));
CString search_sql;
search_sql = "SELECT * FROM cmdchoose";
cmd.m_pRecordset = cmd.m_pConnection->Execute(search_sql.AllocSysString(), NULL, adCmdText);
while (!cmd.m_pRecordset->adoEOF)
{
CString id;
CString chooseid;
CString choosevalue;
id = cmd.m_pRecordset->GetCollect("id").bstrVal;
m_list.InsertItem(0, id);
chooseid = cmd.m_pRecordset->GetCollect("chooseid").bstrVal;
m_list.SetItemText(0, 1, chooseid);
choosevalue = cmd.m_pRecordset->GetCollect("choosevalue").bstrVal;
m_list.SetItemText(0, 2, choosevalue);
cmd.m_pRecordset->MoveNext();
}
cmd.m_pRecordset->Close();
}
catch (_com_error e)
{
AfxMessageBox(_T("搜尋失敗!"));
return;
}
增加資料庫條目:
_variant_t RecordsAffected;
CString AddSql;
CString cmdchooseID;
CString cmdchoose;
CString cmdchoosevalue;
m_edit_chooseid.GetWindowText(cmdchooseID);
m_editchoose.GetWindowText(cmdchoose);
m_editchoosevalue.GetWindowText(cmdchoosevalue);
AddSql.Format("INSERT INTO cmdchoose(id,chooseid,choosevalue) VALUES('" + cmdchooseID + "','" + cmdchoose + "','" + cmdchoosevalue + "')");
try{
cmd.m_pConnection->Execute((_bstr_t)AddSql, &RecordsAffected, adCmdText);
AfxMessageBox(_T("新增命令成功!"));
OnBnClickedSelect();
}
catch (_com_error*e){
AfxMessageBox(_T("新增命令失敗!"));
}
刪除資料庫條目:
CString str;
CString choose_del;
m_choosedel.GetWindowText(choose_del);
try
{
str.Format("DELETE from cmdchoose where id='" + choose_del + "'");
_variant_t RecordsAffected;
cmd.m_pConnection->Execute((_bstr_t)str, &RecordsAffected, adCmdText);
AfxMessageBox(_T("刪除成功!"));
OnBnClickedSelect();
}
catch (_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
這裡我在程式的下方新建了一個Combo控制元件用來演示資料庫裡的內容如何加入到Combo box中以及多個Combo的聯動,這裡主要困惑點在於如何點選Combo box實時進行資料庫內容的讀取,主要分為幾步:
a、新增下拉響應函式,點選下拉時觸發響應
b、進行資料庫查詢
c、將查詢到的字串進行處理,新增到Combo box中進行顯示
這裡觸發響應的程式碼如下:
void CdatabaseDlg::OnDropdownComboCity()
{
// TODO: 在此新增控制元件通知處理程式程式碼
{
maincmd.OnInitDialog();
UpdateData(true);
CString strName;
m_choosename.ResetContent();
try
{
maincmd.m_pRecordset.CreateInstance(__uuidof(Recordset));
CString search_sql1;
search_sql1.Format(_T("SELECT * FROM cmdchoose"));
maincmd.m_pRecordset = maincmd.m_pConnection->Execute(search_sql1.AllocSysString(), NULL, adCmdText);
while (!maincmd.m_pRecordset->adoEOF)
{
strName = maincmd.m_pRecordset->GetCollect("id").bstrVal;
m_choosename.AddString(strName);
maincmd.m_pRecordset->MoveNext();
}
maincmd.m_pRecordset->Close();
}
catch (_com_error e)
{
AfxMessageBox(_T("搜尋失敗!"));
return;
}
}
}
部分內容參考的博文:VS2013在MFC中使用ADO方法操作Access2013資料庫