1. 程式人生 > >VS2013 MFC連線Access資料庫(ADO)詳細版例項操作(含Combo Box讀取資料庫內容,附原始碼)

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資料庫