上一篇: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):设计记录操作界面 |
---|