您的位置:首页 > 编程语言 > C语言/C++

vc++中Dao数据库的简单应用实例

2010-03-05 12:22 387 查看
源码下载地址(VC2005编写)

http://d.namipan.com/d/c74ed2aeba1928ce9db9a27eb6f08bd9df230fa3d18f4a00

1、工资管理系统

该系统在磁盘上储存了某单位上月全体员工的工资信息,对于每一位职工存储以下信息:
月份,职工编号,基本工资,津贴,岗贴,补贴,房贴,交通补贴,应发数,房租,储蓄,会费,个人所得税,应扣数,实发数。
个人所得税计算方法设定为:工资少于800元为0,800-1000元的部分为5%,1000-5000元的部分为10%,5000元以上的部分为20%。
该系统功能如下:
1)创建存储职工工资信息的存储系统。
2)添加职工的工资信息(增加新职工时用)
3)删除某职工的工资信息(职工离职或者死亡时用)
4)修改某职工的部分工资信息(当月开始增加或减少某些项工资或扣款数变化)
5)输出指定编号职工的工资信息(查询用)
6)输出当月全体职工的工资信息(发工资用)

编译说明:

本工程用VC2005编写,在VC6.0下无法编译(没有dsp和dsw文件)。 没有使用宽字符。如果需要移植到6.0下,可以先用VC6.0新建一个与此工程同名(WageManager)的SDI单文档工程,把本工程下的所有.h和.cpp文件拷贝到新建的工程目录下覆盖,然后在编译器的文件面板中将各个文件添加到新建的工程中。除此之外还需要将res目录下的文件也覆盖到6.0下新建的工程文件夹内。
在VC2005中Dao数据库的使用仅仅只需要包含afxdao.h,不清楚在VC6.0中此文件是否存在。

在其他的电脑上演示时,建议使用Release版本(Release目录下的执行文件)。除非对方电脑上装了与你同样的VC++编译器,否则Debug版本(Debug目录下的执行文件)很可能因为找不到必要的DLL库而不能启动。测试Release版本在没有装VC和Microsoft Access的PC上使用正常

工资信息数据表文件WageInfo.mdb必须和应用程序处在同一目录内,当找不到该文件或者文件无法打开时,会自行创建一个空的数据表。

程序设计过程:

根据题目要求,程序框架为SDI单文档,用DAO操作MDB数据库保存全体员工的工资信息,用CListView列表视图显示数据表中所有员工的信息,与视图关联的文档类没用到。

1、新建MFC单文档(SDI)工程,在最后一步将默认的CView类更改为CListView类;
2、在stdafx.h中添加语句:#include"afxdao.h" ,用以支持DAO数据库操作。

为防止本程序在同一时间运行多个实例,造成数据表访问紊乱,在WageManager.cpp的InitInstance()函数开头添加了如下语句(变量添加在此函数开头):
CString strName = _T("WageManagerApplication");
hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, strName);
if(hMutex == NULL)
{
hMutex = CreateMutex(NULL,NULL,strName);
}
else
{
AfxMessageBox(_T(" 工资信息管理器已启动 !"));
return false;
}

3、自定义工资信息数据表类:CWageDBDaoSet。该类由CDaoRecordset公有派生而来。类的具体定义见代码文件WageDBDaoSet.h和WageDBDaoSet.cpp。
4、在数据表类CWageDBDaoSet中重载了它的基类的三个函数:GetDefaultDBName()、GetDefaultSQL()和DoFieldExchange()。它们的作用分别是:
GetDefaultDBName():指定默认的数据库文件名称,本程序不允许用户更改数据库文件,也没这个必要;
GetDefaultSQL():指定默认数据库中默认的数据表(一个个数据库文件中可以有多个表,与Excel类似)。
DoFieldExchange():将表中的各个字段与变量关联起来,便于自动读取数据(与对话框类的DoDataExchange函数类似)。
5、另外为CWageDBDaoSet类自定义了一个函数CreateWageInfoMDB(),作用是创建一个空的工资信息表。这个函数只在程序在某台PC上首次运行时调用,或者在数据库文件丢失损坏时调用。
6、在视图类的头文件WageManagerView.h中包含自定义数据表类的头文件,并在该视图类中声明一个CWageDBDaoSet对象 m_WageDB.

7、在视图类的初始化函数OnInitialUpdate()中初始化视图列表,包括:将视图属性定义为报表(LVS_REPORT)、有边框(LVS_BORDER)、单选(LVS_SINGLESEL)、选择常显示(LVS_SHOWSELALWAYS)、网格(LVS_EX_GRIDLINES)、选择整行(LVS_EX_FULLROWSELECT); 设置显示字体为“新宋体”,字高110点;按照题目中要求添加16项。

8、在程序启动时,需要打开检查数据库,因此在视图类中添加一个OpenAndCheckDB()函数,它将在视图初始化函数的结尾处被调用。用try——catch语句打开数据表,如果打开失败,说明数据库不存在,给出错误信息,并尝试创建新的数据库文件,即调用CWageDBDaoSet类的CreateWageInfoMDB()函数。

9、打开数据表后,需要将数据表的信息显示出来,为此在CWageManagerView视图类中添加一个函数UpdateListCtrl()函数,他将在OpenAndCheckDB()函数的结尾处被调用。在以后修改、删除数据表的部分信息后也将调用该函数刷新列表视图。具体的过程见源代码。

10、至此,主窗口界面基本完成,接下来完成功能操作。 首先为视图添加右键菜单支持,即在视图窗口内单击右键会弹出一个菜单,选择相应的菜单项可以对数据表执行以操作:添加信息、删除信息、修改信息、查找信息。 该菜单是弹出式菜单,需要动态创建。菜单有两种状态:1) 右键单击时如果选择了某一行数据,则可以执行修改和删除操作,这两个菜单项为可选状态;2)右键单击时没有选中数据,修改删除操作不能执行,这两个菜单项为不可选状态(变灰)。

11、用添加类向导为视图类添加NM_RCLICK消息。编译器自动跳到生成的函数内部,添加实现代码,具体参见源代码。

12、动态创建菜单时,需要为每个菜单项指定ID,用于以后映射消息函数。添加ID的方法为:在ResourcesView面板中展开String Table,双击打开String Table表,在其最后一行双击可以依次添加ID标识符、ID值、ID对应的含义。

13、为动态创建的菜单手动添加消息响应函数。总共有四个菜单项,对用的函数分别为:void OnAdd() 、void OnDel()、void OnEdit()、void OnFind()。在视图类头文件中添加四个函数的声明。然后打开视图类的cpp文件,找到以语句BEGIN_MESSAGE_MAP(CWageManagerView, CListView)开头,以END_MESSAGE_MAP()结尾的一段。在这两句之间添加消息映射宏:ON_COMMAND(ID,Func) 宏的参数ID为某个菜单项的ID,Func为与该菜单项对应的消息函数名。 然后在cpp文件中添加各个消息函数的实现代码。

14、添加和修改操作要用到对话框,这里在Resources View面板中添加一个对话框资源,并且在上面布置好控件,然后双击该对话框资源为其添加类。在该类外声明一个WageInfo结构体,用于方便的和主对话框传递参数。 该对话框为添加和修改两个操作所共用,而且在显示时内容不一样,所以需要修改该对话框类的构造函数,添加一个BOOL型变量判断是何种操作,从而用不同的方式初始化对话框和对话框的成员函数。具体见源代码。

15、删除操作只需要根据列表中当前选项的ID号,设好数据过滤标准,然后找到该项数据即可删除

16、查找操作也要用到对话框,用来输入需查询的职工ID。创建方法类似于添加和修改对话框。具体的添加、修改、查询、删除操作代码在视图类的cpp中

17、代码必要处已做了注释,可参照MSDN查看各函数或语句的具体用法。

18、16个工资信息项中,应发数、个人所得税、应扣数、实发数这四项未知,要根据其他信息计算。程序编写时只是简单计算,所以这四项的计算公式不一定正确,需要修改。 所有需要修改计算公式的地方已在WageManagerView.cpp中标出。(全部在OnAdd、OnEdit两个函数中)

19、由于程序启动时就打开了数据库并且把内容用列表显示了出来,所以题目中的第六个功能已经满足,不再做设计。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: