創建的時選擇單文檔應用程序,視圖類的模板選擇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);
}