1. 程式人生 > >MFC介面程式設計基礎(24):建立資料庫應用框架

MFC介面程式設計基礎(24):建立資料庫應用框架

上一篇:MFC介面程式設計基礎(23):建立並註冊資料來源 下一篇:MFC介面程式設計基礎(25):設計記錄操作介面

使用MFC類嚮導可以方便地得到一個數據庫應用程式的框架,建立一個MFC單文件EXE應用程式Exam2_1,在嚮導的[資料庫支援]選項也中,選擇單選項“不提供檔案支援的資料庫檢視”,客戶端型別選擇 ODBC 如下圖所示。
在這裡插入圖片描述
單擊“資料來源…”按鈕,彈出“選擇資料來源”對話方塊,
在這裡插入圖片描述
單擊“新建”按鈕,彈出跟上一節介紹的使用ODBC資料來源管理器建立檔案DSN一樣的對話方塊,按照上面介紹的步驟新建立一個檔案資料來源,
在這裡插入圖片描述


建立完畢後文件資料來源列表中會顯示出新新增的資料域 hotel.dsn,單擊“確定”按鈕,再次彈出“ODBC Microsoft Access 安裝”對話方塊,單擊“確定”按鈕
在這裡插入圖片描述
彈出“選擇資料來源物件”對話方塊,選擇相應的資料庫表,單擊“確定”按鈕,彈出“選擇資料物件”對話方塊,列表框中列出了資料庫中所包含的表和查詢,選擇應用程式所操作的表TblCustomer
在這裡插入圖片描述
單擊“確定”按鈕,結束資料來源的設定工作。
單擊MFC應用程式嚮導對話方塊中的“完成”按鈕,完成資料庫應用程式框架的建立,編譯執行這個程式,執行結果如下圖所示。應用程式包含了資料庫記錄基本操作選單和工具按鈕,檢視是一個對話方塊,可以新增控制元件。
在這裡插入圖片描述

資料庫應用程式框架執行效果

選擇工作區的ClassView,展開類樹,進一步觀察AppWizard自動新增的與資料庫支援有關的內容。

增加了一個CExam2_1Set類,該類代表從資料庫中選擇的一組記錄集。程式可以選擇一個表作為一個記錄集,本例選擇了表tblCustomer中的記錄構建記錄集,也可以選擇一個查詢的結果集作為一個記錄集。

如程式清單2-1所示。CExam2_1Set建構函式用於建立一個記錄集物件,並把一個CDatabase物件的指標作為引數傳遞給建構函式,以便獲得已由CDatabase物件建立起來的與資料來源的連線。

CExam2_1Set類的成員函式GetDefaultConnect()用於獲得定義了資料來源型別和資料來源名的連線字串

。GetDefaulltSQL()函式中定義了定義SQL語句的字串,本例的SQL語句定義了查詢一張表的完整記錄。
CExam2_1Set類中定義了與資料來源表的欄位相對應的資料成員,成員函式DoFieldExchange()完成記錄集上的欄位資料成員與資料來源上當前記錄對應列之間資料的自動交換。

程式清單2-1:CExam2_1Set類

//CExam2_1Set.h
class CExam2_1Set : public CRecordset
{
public:
	CExam2_1Set(CDatabase* pDatabase = NULL);
	DECLARE_DYNAMIC(CExam2_1Set)

	int	m_CustomerID;
	CStringW	m_LastName;
	CStringW	m_FirstName;
	CStringW	m_HomeCountry;
	CStringW	m_HomeState;
	CStringW	m_PhoneNumber;
	CStringW	m_Comments;
// Overrides
	public:
	virtual CString GetDefaultConnect();//Default connection string
	virtual CString GetDefaultSQL(); 	// default SQL for Recordset
	virtual void DoFieldExchange(CFieldExchange* pFX);// RFX support

// Implementation
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif
};
//CExam2_1Set.cpp
CExam2_1Set::CExam2_1Set(CDatabase* pdb)
	: CRecordset(pdb)
{
	m_CustomerID = 0;
	m_LastName = L"";
	m_FirstName = L"";
	m_HomeCountry = L"";
	m_HomeState = L"";
	m_PhoneNumber = L"";
	m_Comments = L"";
	m_nFields = 7;
	m_nDefaultType = dynaset;
}

CString CExam2_1Set::GetDefaultConnect()
{
	return _T("DBQ=C:\\USERS\\KEVIN\\Documents\\hotel.mdb;
	DefaultDir=C:\\USERS\\KEVIN\\Documents;
	Driver={Driver do Microsoft Access (*.mdb)};
	DriverId=25;FIL=MS Access;
	FILEDSN=C:\\Users\\Kevin\\Documents\\hotel.dsn;
	MaxBufferSize=2048;
	MaxScanRows=8;PageTimeout=5;SafeTransactions=0;
	Threads=3;UID=admin;UserCommitSync=Yes;");
}

CString CExam2_1Set::GetDefaultSQL()
{
	return _T("[tblCustomer]");
}

void CExam2_1Set::DoFieldExchange(CFieldExchange* pFX)
{
	pFX->SetFieldType(CFieldExchange::outputColumn);
	// RFX_Text() 和 RFX_Int() 這類巨集依賴的是
	// 成員變數的型別,而不是資料庫欄位的型別。
	// ODBC 嘗試自動將列值轉換為所請求的型別
	RFX_Int(pFX, _T("[CustomerID]"), m_CustomerID);
	RFX_Text(pFX, _T("[LastName]"), m_LastName);
	RFX_Text(pFX, _T("[FirstName]"), m_FirstName);
	RFX_Text(pFX, _T("[HomeCountry]"), m_HomeCountry);
	RFX_Text(pFX, _T("[HomeState]"), m_HomeState);
	RFX_Text(pFX, _T("[PhoneNumber]"), m_PhoneNumber);
	RFX_Text(pFX, _T("[Comments]"), m_Comments);
}

檢視類CExam2_1View 是CRecordView的派生類,CRecordView是記錄檢視,支援在控制元件中顯示資料庫記錄。預設提供了移動記錄功能的實現(第一個,上一個,下一個,最後一個)。定義了一個指向記錄集的指標m_pSet。
CRecordView類是CFormView類的派生類,CFormView類的檢視對應一個對話方塊資源,所以CRecordView類從基類中繼承的成員函式中最重要的是DoDataExchange()函式和UpdateData()函式,DoDataExchange()函式實現記錄集的欄位與檢視中控制元件之間的自動資料交換,UpdateData()函式實現記錄集的欄位與檢視中控制元件之間實時交換。

上一篇:MFC介面程式設計基礎(23):建立並註冊資料來源 下一篇:MFC介面程式設計基礎(25):設計記錄操作介面