mfc學習筆記6——使用mysql+mfc實現學生信息的查詢

創建的時選擇單文檔應用程序,視圖類的模板選擇CFormView這樣可以在單文檔應用程序拖動控件


	
四、數據庫編程
1)準備工作
	a) 安裝MySQL服務器
	b) MySQL odbc驅動(32位)
	
2)odbc層次圖
	a) odbc一套標準接口(內部通過sql語句操作數據庫,用戶就算不懂sql語句也可以藉助odbc操作數據庫)
	b) 數據源,本質上是一個文件,記錄了數據庫的IP,用戶名,表名等信息,windows要求必須有數據源纔可以連接數據庫。
		即windows多了一步讀取數據源的信息。
		數據源分類:文件數據源(可以copy給別人用),機器數據源只能自己的電腦用
		數據源是在創建代碼的時候提供需要的數據庫信息

3)如何創建數據源(MySql只能是快照)
	a)快照(Snapshot)記錄集:每次操作重新查詢後才更新
	b)動態(Dynaset)記錄集:每次操作自動更新(添加記錄外)

4)應用程序框架(添加了一個set類)
class C項目名字Set : public CRecordset
查看類就會發現,會增加一個XXXset類,並且數據庫的字段會自動關聯一個變量。(雙擊xxxset類就可以查看)
		long	m_id;
		CStringW	m_name;
		long	m_age;
		long	m_score;
		
		給字段賦值,就相當於往數據庫裏面存儲,向字段裏取內容,就相當於從數據庫裏面讀取數據。
	a) CRecordset的子類,主要是對數據庫進行相應操作
		1)DoFieldExchange() 自動把數據庫的字段和變量相關聯
				RFX_Long(pFX, _T("[id]"), m_id);
				RFX_Text(pFX, _T("[name]"), m_name);
				RFX_Long(pFX, _T("[age]"), m_age);
				RFX_Long(pFX, _T("[score]"), m_score);
		2)GetDefaultConnect() 獲取數據庫連接信息,從數據源加載過來的
				return _T("Driver=MySQL ODBC 5.3 Unicode Driver;SERVER=localhost;UID=root;PWD=www158418;DATABASE=info;PORT=3306");
		3)GetDefaultSQL() 獲取數據庫連接的表
				return _T("[student]");
	b) CFormView的子類,顯示數據庫內容的視圖
		1)OnInitialUpdate() 主要作初始化功能
	
5)通過 CRecordset 類對數據庫進行相應操作
	a) 視圖類頭文件創建 CRecordset的子類對象
	b) 視圖類做 增刪改查 操作
		1)打開數據庫 CRecordset::Open(在初始化的時候在view裏面打開數據庫)
		2)查詢記錄 CRecordset::Requery(查詢之後會回到最開始的第一個元素)
		3)移動上一個記錄集 CRecordset::MovePrev
		4)移動下一個記錄集 CRecordset::MoveNext
		5)是否爲最後一個記錄的下一個 CRecordset::IsEOF---(end of file)
		6)是否爲第一個記錄的上一個 CRecordset::IsBOF---(begin of file)
		7)移動到第一個記錄 CRecordset::MoveFirst 
		8)移動到最後一個記錄 CRecordset::MoveLast
		9)添加空記錄 CRecordset::AddNew(數據庫添加記錄的時候,按完“確定”才添加,所以需要先添加一個空記錄)
		10)如果記錄集可修改 CRecordset::CanUpdate
		11)更新記錄集 CRecordset::Update
		12)刪除當前記錄 CRecordset::Delete
		13)編輯當前記錄 CRecordset::Edit
		14)過濾 CRecordset::m_strFilter
		15)排序 CRecordset::m_strSort(默認升序,降序加 desc)
	c) 注意點
		1)移動記錄集,注意越界處理
		2)更新記錄前,先通過 CRecordset::CanUpdate 判斷可更新後,才進行更新
		3)刪除數據後,最好移動到下一個記錄集
		---------------------------------------------------------------------------
		在文檔類定義數據庫對象指針,在視圖類中包含數據庫對象頭文件,獲取數據庫對象指針就可以操作數據庫。數據庫對象指針可以理解爲指向數據庫對象元素的指針。打開數據庫的時,默認指向第一個
		---------------------------------------------------------------------------
步驟:(1)佈局好ui之後,給4個編輯框關聯變量,命名的時候添加ui標誌作爲控件關聯的變量

			(2)雙擊“上一個”按鈕,添加默認的單擊後執行代碼
				1.在“文檔類”裏包含set類頭文件#include "DataBaseSet.h"
			
				2.根據set類在文檔類裏面創建一個數據集對象,並通過公有接口去訪問
						public:
							CDataBaseSet*GetSet()
							{//數據庫記錄集對象
								return &pSet;
							}
						private:
							CDataBaseSet pSet;

			3.在視圖類裏面把數據庫打開OnInitialUpdate()
					//需要獲取文檔對象指針
					//pSet設置爲成員變量(寫在視圖類)且是私有的,所有需要通過函數去調用
					private:
							CmydatabaseSet*pSet;
					
			--------------------------------------------------------------------------------	
			注意改進的地方,把pSet設置爲視圖類的一個成員變量,就可以不在每次的時候獲取指針了
			CDataBaseSet *pSet;//此處的定義改到成員變量中
			--------------------------------------------------------------------------------
			//在初始化的時候把數據庫打開
				//獲取文檔對象指針
				CDataBaseDoc *pDoc = GetDocument();
				//獲取數據庫記錄集指針
				CDataBaseSet *pSet = pDoc->GetSet();
				if (false==pSet->IsOpen())//如果數據庫沒有打開,就打開數據庫
				{
					pSet->Open();//打開數據庫
				}
				//此時數據庫指針指向數據庫的第一個元素,把變量值更新到ui變量
				m_uiId = pSet->m_id;
				m_uiName = pSet->m_name;
				m_uiAge = pSet->m_age;
				m_uiScore = pSet->m_score;
				//把ui變量的值更新到編輯框
				CWnd::UpdateData(false);
			4.
			void CDataBaseView::OnBnClickedButton1()
			{
				// TODO:  在此添加控件通知處理程序代碼
				//獲取文檔對象指針
				CDataBaseDoc *pDoc = GetDocument();
				//獲取數據庫記錄集指針
				CDataBaseSet *pSet = pDoc->GetSet();
				//移動到上一個
				pSet->MovePrev();
				//如果是開始的第一個元素,就顯示最後一個
				if (pSet->IsBOF())
				{
					pSet->MoveLast();
				}
				//重建--刷新記錄集
				//pSet->Requery();//注意裏面不要寫查詢的語句,否則pset會回到開始的位置
				//將文件讀取出來,並更新到編輯框顯示出來
				m_uiId = pSet->m_id;
				m_uiName = pSet->m_name;
				m_uiAge = pSet->m_age;
				m_uiScore = pSet->m_score;
				CWnd::UpdateData(false);

			}


		//下一個按鈕
		void CDataBaseView::OnBnClickedButton2()
		{
			// TODO:  在此添加控件通知處理程序代碼
			CDataBaseDoc*pDoc = GetDocument();
			CDataBaseSet*pSet = pDoc->GetSet();
			//移動到下一個元素,
			pSet->MoveNext();
			if (pSet->IsEOF())
			{
				pSet->MoveFirst();
			}
			//將文件讀取出來,並更新到編輯框顯示出來
			m_uiId = pSet->m_id;
			m_uiName = pSet->m_name;
			m_uiAge = pSet->m_age;
			m_uiScore = pSet->m_score;
			CWnd::UpdateData(false);
		}
		//單擊添加記錄按鈕
		void CDataBaseView::OnBnClickedButton3()
		{
			// TODO:  在此添加控件通知處理程序代碼
			//按“確定”的時候才添加進去(執行賦值操作),這裏只是添加一行空記錄
			CDataBaseDoc*pDoc = GetDocument();
			CDataBaseSet*pSet = pDoc->GetSet();
			pSet->AddNew();
		}

		//單擊確定按鈕,進行賦值的操作
		void CDataBaseView::OnBnClickedButton5()
		{
			// TODO:  在此添加控件通知處理程序代碼
			CDataBaseDoc*pDoc = GetDocument();
			CDataBaseSet*pSet = pDoc->GetSet();
			//把編輯框中的內容更新到ui變量中,然後再更新到數據庫變量中
			CWnd::UpdateData(true);
			pSet->m_id = m_uiId;
			pSet->m_name = m_uiName;
			pSet->m_age = m_uiAge;
			pSet->m_score = m_uiScore;
			//更新到數據庫,首先要端盤數據庫是否可以更新
			if (pSet->CanUpdate())
			{
				pSet->Update();
			}
			MessageBox(TEXT("記錄添加成功"));
		}

		
//修改按鈕
void CDataBaseView::OnBnClickedButton4()
{
	// TODO:  在此添加控件通知處理程序代碼
	//修改數據庫
	CDataBaseDoc*pDoc = GetDocument();
	CDataBaseSet*pSet = pDoc->GetSet();
	//修改數據庫
	pSet->Edit();
	//把編輯框中的內容更新到對應的ui便來給你中保存,然後再更新到數據庫變量
	UpdateData(true);

	pSet->m_id = m_uiId;
	pSet->m_name = m_uiName;
	pSet->m_age = m_uiAge;
	pSet->m_score = m_uiScore;
	if (pSet->CanUpdate())
	{
		pSet->Update();
	}
	MessageBox(TEXT("更新成功"));
}


//刪除按鈕
void CDataBaseView::OnBnClickedButton6()
{
	// TODO:  在此添加控件通知處理程序代碼
	CDataBaseDoc*pDoc = GetDocument();
	CDataBaseSet*pSet=pDoc->GetSet();
	pSet->Delete();//刪除當前指向的數據記錄
	//查詢一下
	pSet->Requery();
	//刪除後不顯示這個元素,重新賦值ui變量,顯示出來
	m_uiId = pSet->m_id;
	m_uiName = pSet->m_name;
	m_uiAge = pSet->m_age;
	m_uiScore = pSet->m_score;
	UpdateData(false);
	MessageBoxW(TEXT("刪除成功"));
}


//查詢年齡大於18歲
void CDataBaseView::OnBnClickedButton7()
{
	// TODO:  在此添加控件通知處理程序代碼
	//設置過濾條件
	CDataBaseDoc*pDoc = GetDocument();
	CDataBaseSet*pSet = pDoc->GetSet();
	pSet->m_strFilter = TEXT("age>18");
	//重新查詢,本質是使指針歸位
	pSet->Requery();
	//爲了點擊之後馬上更新
	m_uiId = pSet->m_id;
	m_uiName = pSet->m_name;
	m_uiAge = pSet->m_age;
	m_uiScore = pSet->m_score;
	UpdateData(false);
}


//按照年齡降序查詢
void CDataBaseView::OnBnClickedButton8()
{
	// TODO:  在此添加控件通知處理程序代碼
	CDataBaseDoc*pDoc = GetDocument();
	CDataBaseSet*pSet = pDoc->GetSet();
	//默認是按照升序排列的
	pSet->m_strSort = TEXT("age desc");//是定義好的變量,賦值即可
	pSet->Requery();
	//顯示更新
	m_uiId = pSet->m_id;
	m_uiName = pSet->m_name;
	m_uiAge = pSet->m_age;
	m_uiScore = pSet->m_score;
	UpdateData(false);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章