设计思路:
分层:界面层,数据访问层,数据库;
数据访问层的作用是为界面层提供一个数据访问接口,隔离界面层和数据库;界面层不需要知道采用的哪种数据库,只需要调用数据访问层提供的接口来完成各种操作;
1.新建一个基于对话框的MFC程序,命名CallList
2.设计程序界面如下图:


3.数据访问层的实现:
在StdAfx.h中添加#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
新建一个类CDataSource,作用是封装数据层,定义如下

Code

该类对外提供的方法是一些基本数据库操作,用户可根据需要进行添加。
4.对各种方法的实现,本例中采用的是ADO访问,所以定义了m_pConn和m_pRecordset两个对象。
实现InitData,作用是初始化数据库访问模块,包括数据库连接的初始化、记录集的初始化和当前数据库中最大ID的初始化,实现代码为:

Code

和InitData方法对应的是FreeData方法,作用是关闭打开的记录集和数据库并释放到记录集和数据库指针,
注意该函数在CDataSource的析构函数中调用,实现代码为:

void CDataSource::FreeData()
{
    
if (m_pConn)
    {
        m_pConn
->Close();
        m_pRecordset.Release();
        m_pConn.Release();
        CoUninitialize();
    }
}

接来下实现数据指针移动函数,这些函数是对ADO数据指针移动操作的封装:

Code

下面实现的是当前记录指针位置的函数:

Code

其中IsBOF和IsEOF函数是对ADO的直接封装,很容易理解,接来下实现设置和返回记录值的函数

Code

最后要实现的是记录集的新建、更新和删除函数,代码如下:

Code

至此,数据访问层类CDataSource已经实现了。整体上看,是对ADO操作的封装,更改数据库时,只需重写InitData函数即可。

5.界面层的实现
界面层是对界面显示控制的封装,本例模块比较简单,可将代码直接写入CCallList类中,
在CCallList类中定义一个CDataSource类对象:    CDataSource m_ds;
在对话框初始化函数OnIninDialog中初始化m_ds的数据,添加:m_ds.InitData();

为每个编辑框定义一个CEdit类型的对象,如图


为CCaiiListDlg类添加函数void LoadData,作用是将当前记录的内容装载到界面中

Code


为CCaiiListDlg类添加函数BOOL IsNeedUpdate(),作用是判断用户对界面上的数据是否进行了修改,判断的方法是使用记录中的字段和当前界面中数据比较,如有不同,说明用户修改了具体代码为:

Code

为每个按钮定义一个CButton类型的对象,如上图2中
为CCallListDlg类添加函数 void RefreshUpdateBtn(),作用是刷新“更新”按钮的可用与否;添加void RefreshView(),作用是刷新界面各控件的可用性,两个函数的代码如下:

Code


为每一个按钮定义一个 BN_CLICKED 事件,编辑代码如下:

Code

为每个编辑框定义一个EN_CHARGE事件,编辑代码为:

Code


至此基本信息和按钮部分已经设定完毕,对数据库的表格显示部分操作为:

在对话框编辑窗口右键单击,选择 Insert ActiveX Control ,插入 Microsoft ADO Data Control 6.0 (SP6) 控件,设置其属性
选中Control页签——Use Connection String ,按Build按钮,本例中选择 Microsoft Jet 4.0 OLE DB Provider,点击下一步,写入 C:\\Demo.mdb ; 
选中RecordSource页签,在Command Type中选择 2-adCmdTable ,在下面的表中选择储存通讯录的表名;

插入Microsoft Hierarchical FlexGrid Control控件
在其属性的ALL标签页中将DataSourcr属性设置为 IDC_ADODC1

编译运行该程序吧!

posted on 2009-09-25 21:25  苏伟  阅读(2574)  评论(2编辑  收藏  举报