基于MFC和Access数据库实现的学生学习成绩信息管理系统

1 题目要求


设计一个学生学习成绩信息管理系统,ODBC方式连接。

2 功能需求


  • 用户管理:新增用户,删除用户

  • 学生信息管理:增加学生信息,删除学生信息,查询学生信息

  • 学生成绩管理:录入学生成绩,修改学生成绩,删除学生成绩

  • 计算总评:计算总评功能的实现

voidCStudentbaView::OnButton1(){// TODO: Add your control notification handler code here
m_pSet->m_SumScore=long(m_pSet->m_NormalScore*0.1+m_pSet->m_MidScore*0.2+m_pSet->m_FinalScore*0.7);UpdateData(FALSE);}

3 总体设计


系统模块

4 详细设计


在原来的基础上进行了完善。实验指导书上有的内容省略。

学生成绩查改删功能的实现:

在资源视图下添加一个对话框,添加ID,添加相应控件,如下图:

为IDD_DIALOG_SEARCH添加一个新类 SEARCH 并添加相应映射变量:

重载OnInitDialog()函数:

BOOLSEARCH::OnInitDialog(){
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	m_ctrList.InsertColumn(0," 序号");
	m_ctrList.InsertColumn(1," 学号");
	m_ctrList.InsertColumn(2," 姓名");
	m_ctrList.InsertColumn(3," 科目");
	m_ctrList.InsertColumn(4," 成绩");
	m_ctrList.InsertColumn(5," 补考成绩");
	m_ctrList.InsertColumn(6," 缺考标志");
	m_ctrList.SetColumnWidth(0,60);
	m_ctrList.SetColumnWidth(1,80);
	m_ctrList.SetColumnWidth(2,80);
	m_ctrList.SetColumnWidth(3,100);
	m_ctrList.SetColumnWidth(4,80);
	m_ctrList.SetColumnWidth(5,80);
	m_ctrList.SetColumnWidth(6,60);
	m_ctrList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	CStringstrSQL="select * from score";
	RefreshData(strSQL);
	returnTRUE;// return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

为SEARCH类添加RefreshData(strSQL)函数:

voidSEARCH::RefreshData(CStringstrSQL){
	m_ctrList.DeleteAllItems();
	m_ctrList.SetRedraw(FALSE);
	UpdateData(TRUE);
	if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
	{
		MessageBox(" 打开数据库失败!"," 数据库错误",MB_OK);
		return;
	}
	inti=0;
	charbuffer[20];
	while(!m_recordset.IsEOF())
	{
		_ltoa(m_recordset.m_ID,buffer,10);
		m_ctrList.InsertItem(i,buffer);
		m_ctrList.SetItemText(i,1,m_recordset.m_code);
		m_ctrList.SetItemText(i,2,m_recordset.m_name);
		m_ctrList.SetItemText(i,3,m_recordset.m_subject);
		_ltoa(m_recordset.m_score,buffer,10);
		m_ctrList.SetItemText(i,4,buffer);
		_ltoa(m_recordset.m_makeup_score,buffer,10);
		m_ctrList.SetItemText(i,5,buffer);
		m_ctrList.SetItemText(i,6,m_recordset.m_absent);
		i++;
		m_recordset.MoveNext();
	}
	m_recordset.Close();
	m_ctrList.SetRedraw(TRUE);}

为查询添加消息响应函数:

voidSEARCH::OnBnClickedButtonSearch(){
	// TODO: Add your control notification handler code here
	UpdateData();
	CStringstrSQL,strTemp;
	strTemp="";
	BOOLbHaveCon=FALSE;
	if(m_strSubject!="")
	{
		strSQL.Format("select * from score where subject = '%s' ",m_strSubject);
		bHaveCon=TRUE;
	}
	if(m_strName!="")
	{
		if(bHaveCon)
		{
			strTemp.Format(" name = '%s' ",m_strName);
			strSQL=strSQL+" and "+strTemp;
		}
		else
		{
			strSQL.Format("select * from score where name = '%s' ",m_strName);
		}
		bHaveCon=TRUE;
	}
	if(m_strClass!="")
	{
		if(bHaveCon)
		{
			strTemp.Format(" class = '%s' ",m_strClass);
			strSQL=strSQL+" and "+strTemp;
		}
		else
		{
			strSQL.Format("select * from score where class = '%s' ",m_strClass);
		}
		bHaveCon=TRUE;
	}
	if(!bHaveCon)
	{
		strSQL="select * from score";
	}
	RefreshData(strSQL);}

为删除添加消息响应函数:

voidSEARCH::OnButton1Delete(){
	// TODO: Add your control notification handler code here
	inti=m_ctrList.GetSelectionMark();
	if(0>i)
	{
		AfxMessageBox(" 请选择一条记录进行查看!");
		return;
	}
	CStringstrSQL;
	/*strSQL.Format("select * from score where ID = '%s'",m_ctrList.GetItemText(i,0));*/
	/*	strSQL.Format("select * from score where ID = '%d'",m_ctrList.GetSelectionMark());*/
	strSQL.Format("select * from score where ID=%s",m_ctrList.GetItemText(i,0));
	if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
	{
		AfxMessageBox(" 打开数据库失败!");
		return;
	}
	m_recordset.Delete();
	m_recordset.Close();
	strSQL="select * from score";
	RefreshData(strSQL);}

在资源视图下添加一个对话框IDD_DIALOG_SCORE_UP

添加相应控件,如下图:

为其添加一个类:SCORE_UP_Dialog 并对应相应变量:

  • 在SEARCH.h添加:#include "ScoreSet.h"

  • 并声明一个变量:CScoreSet m_recordset;

  • 在SEARCH类添加:#include "SCORE_UP_Dialog.h"

为修改添加消息响应函数:

voidSEARCH::OnButton1Modify(){
	// TODO: Add your control notification handler code here
	SCORE_UP_DialogDlg;
	UpdateData();
	inti=m_ctrList.GetSelectionMark();
	if(0>i)
	{
		AfxMessageBox(" 请选择一条记录进行修改!");
		return;
	}/*	Dlg.m_strCode=m_ctrList.GetItemText(i,0);*//*	Dlg.m_ID=m_ctrList.GetItemText(i,0);*/
	if(IDOK==Dlg.DoModal())
	{// 修改记录
		CStringstrSQL;
	/*	strSQL.Format("select * from student where code = '%s'",Dlg.m_strCode);*/
		strSQL.Format("select * from score where ID=%s",m_ctrList.GetItemText(i,0));/*		strSQL.Format("select * from score where ID=%s",Dlg.m_ID);*/
		if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
		{
			AfxMessageBox(" 打开数据库失败!");
			return;
		}
		m_recordset.Edit();/*		CString m_str_Score;*/// 		m_recordset.m_code =Dlg.m_strCode ;
// 		m_recordset.m_name =Dlg.m_strName ;
// 		m_recordset.m_sex =Dlg.m_strSex ;
// 		m_recordset.m_birthday =Dlg.m_tmBirth ;
// 		m_recordset.m_department =Dlg.m_strDepartment ;
// 		m_recordset.m_major =Dlg.m_strMajor ;
//		m_recordset.m_class =Dlg.m_strClass ;
// 		m_recordset.m_phone =Dlg.m_strPhone ;
// 		m_recordset.m_address =Dlg.m_strAddress ;
/*		m_recordset.m_ID=Dlg.Dlg.m_ID;*//*		m_recordset.m_ID=m_ctrList.GetItemText(i,0);*//*		itoa(Dlg.m_strSCore,m_strScore,10);*/
		m_recordset.m_score=Dlg.m_str_Score;
		m_recordset.m_makeup_score=Dlg.m_str_Makeup;
		m_recordset.Update();
		m_recordset.Close();
		strSQL="select * from score ";
		RefreshData(strSQL);
	}}

调用该对话框:

为StudentView.cpp添加包含“SEARCH.h”的语句。为CStudentView类添加菜单ID_SCORE_SEARCH的命令消息响应函数:voidCStudentView::OnScoreSearch(){
	// TODO: Add your command handler code here
	SEARCHdlg;
	dlg.DoModal();}

5 测试与实现


6 总结


基本实现了学生信息管理系统应有的功能。

刚开始问题主要是来自IDE,因为参考书用的IDE应该是vs2010。

而在VC6环境下,有的地方要小改一下,比如要继承CRecordser类要在 StdAfx.h里加#include <afxdb.h>。而且VC6只支持256色图,不支持24位色图,要把24位图变成256色图要缺色,挺难看的。

而在VS2015环境下,也有的地方要改一下,比如AfxMessageBox();

我比对了一下,IDE用VS2015比VC6好得多,所以最后我选择用VC6。

这次的作业除了把指导书上的抄上去,我仿照着学生信息管理增添了学生成绩管理的功能。

做之前研究了一下,感觉不难。但是加代码的时候还是遇到了一些问题,主要是因为score表和student表不一样的缘故,改了一下之后就没问题了。

在用代码添加ODBC数据源的时候出现了一些问题,本来以为COPY上去就行了,但是不行,只好看了一下它的逻辑,然后发现是驱动的问题,ACCESS 2003之后的数据库后缀名都是.accdb了,用的是另一个驱动了。

然后把数据库另存为了一下,后缀名改成.mdb了,把数据源名称也改成自己做的时候内个名字,就没啥问题了。

不过最后测试的时候还是出了点问题,测试的时候为了显示24位图,把程序拉到主机上用VS2015运行了。添加学生成绩功能,在虚拟机上跑就没什么事,在主机上不行,不过没时间管这个了。

这次“开发”过程还好,不是很曲折,最曲折的应该是代码写到一半发现可以复制粘贴。。。

参照着学生信息管理功能做了学生成绩管理功能,个人感觉还是不错的..虽然说排序什么的都没做。主要是没有时间阿。。周五周末都不在学校,还要其它的事情要做,要是能多一天时间应该会把排序,特殊查询做了。

总体来说还是学到了一点东西,以前只会在对话框程序里加个作者菜单,在单文档程序里加个作者菜单都不会。。现在会了。。其实都一样。。

对ODBC多了解了一些吧。。大概知道它这个数据是怎么显示在控件里,怎么实现CRUD操作的了。。虽然叫我不参照别人的代码我还是不会做。。

界面不太友好,这个没办法。。我不太会弄这个。。。

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
高一新生入学,由于时间仓促,组织入学编班总是没有来得及把学号编上,后来做档案管理的时候,总是有两份表,一份表是学校编班的在校花名册,另一份表格是在中考系统导出后经过编辑最后上报的花名册。在校花名册中带有班级、号数、姓名等字段,且经常有改动;上报名册中带有姓名学号、身份证号码的字段。每个学期在编辑学生学业模块修习评价表和评价总表的时候要求记录中带有班级、座号、姓名、学号。由于在校花名册经常改动,学生姓名有时候该同音字或者形近字,甚至改姓的。学校要求打印给教师填写的要用在校姓名,第二学期初上报的时候又要求和之前上报的一致(以前有过用在校花名册上报的,高三毕业的时候,上级某些管理部门翻看修习情况表发现名字不符,结果不给盖印),除了名字改动,还有大量的重名问题。因而给档案管理带来极大的不便。这个小软件就是通过在校花名册和上报名册整理出名字变动和重名的给教师校对,整理编辑后最终合成带有班级、座号、在校姓名、学号、上报姓名的表格。导入名册之前请先把姓名等中空格删除。 以下带&&&的为手工操作 高一 &&&导入高一上报名册为高一 &&&导入高一学生花名册两次分别为高一1,高一2(后面修改时候高一2不修改,用于最后比较) 查询 高一重名 **查看高一花名册中各个名字出现的次数 查询 高一1重名人 **查询高一花名册中名次出现次数大于等于2的 查询 高一学生名单 **按姓名连接学生花名册和上报名册, 查询班级,座号,姓名,学号,身份证号,性别 查询 高一学生名单重名** 查看查看高一学生名单中各个名字出现的次数 查询 高一学生名单重名人 **查询出现重名的记录 查询 高一重名2 **提供重名名单选择校对 查询 高一学生重名校对**体重重名名单给教师校对 查询 高一花名册有而上报名册无的学生名册 查询 高一花名册有而上报名册无的学生名册2 查询 高一上报有而花名册无的学生名册 查询 高一上报有而花名册无的学生名册2 ****以上四个查询用于查询校对名字出现形近或同音的记录,2的为查询结果,供教师校对 高二 &&&导入高二上报名册为高二 &&&导入高二理科在校生名册为高二1 &&&导入高二文科在校生名册为高二2 &&&导入高二在在校生名册总表为高二12 查询 高二上报有而花名册无的学生名册 查询 高二上报有而花名册无的学生名册2 **查询有上报而不在学校花名册中的记录 查询 高二花名册有而上报名册无的学生名册 查询 高二花名册有而上报名册无的学生名册2 **查询出花名册有而没上报的记录 ***以上四个查询用于校对名字出现形近或者同音字的记录,2的为查询结果,供教师校对 查询 高二1重名**高二理科花名册各姓名出现次数 查询 高二1重名人 **高二理科花名册中同名的学生名单 查询 高二理科名单 **按姓名字段,从理科花名册和上报名次中连接查找出理科名册 查询 高二理科名单重名 **查询高二理科名单中各名次出现的次数 查询 高二理科名单重名人 **高二理科名单重名的学生名单 查询 高二重名1 **查询高二理科名单和高二理科名单重名人,出现重复的记录交由各班主任校对 **以上查询用于校对删除高二理科名单中出现重名的错误或者重叠记录 查询 高二2重名**高二文科花名册各姓名出现次数 查询 高二2重名人 **高二文科花名册中同名的学生名单 查询 高二文科名单 **按姓名字段,从文科花名册和上报名次中连接查找出理科名册 查询 高二文科名单重名 **查询高二文科名单中各名次出现的次数 查询 高二文科名单重名人 **高二文科名单重名的学生名单 查询 高二重名2 **查询高二文科名单和高二文科名单重名人,出现重复的记录交由各班主任校对 **以上查询用于校对删除高二文科名单中出现重名的错误或者重叠记录 高三 &&&导入高三上报名册为高三 &&&导入高三理科在校生名册为高三1 &&&导入高三文科在校生名册为高三2 &&&导入高三花名册总表为高三12 查询 高三上报有而花名册无的学生名册 查询 高三上报有而花名册无的学生名册2 **查询有上报而不在学校花名册中的记录 查询 高三花名册有而上报名册无的学生名册 查询 高三花名册有而上报名册无的学生名册2 **查询出花名册有而没上报的记录 ***以上四个查询用于校对名字出现形近或者同音字的记录,2的为查询结果,供教师校对 查询 高三1重名**高三理科花名册各姓名出现次数 查询 高三1重名人 **高三理科花名册中同名的学生名单 查询 高三理科名单 **按姓名字段,从理科花名册和上报名次中连接查找出理科名册 查询 高三理科名单重名 **查询高三理科名单中各名次出现的次数 查询 高三理科名单重名人 **高三理科名

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员奇奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值