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

Pubertyly

发布日期: 2020-12-31 19:05:30 浏览量: 542
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1 题目要求

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

2 功能需求

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

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

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

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

    1. void CStudentbaView::OnButton1()
    2. {
    3. // TODO: Add your control notification handler code here
    4. m_pSet->m_SumScore=long(m_pSet->m_NormalScore*0.1+m_pSet->m_MidScore*0.2+m_pSet->m_FinalScore*0.7);
    5. UpdateData(FALSE);
    6. }

3 总体设计

系统模块

4 详细设计

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

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

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

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

重载OnInitDialog()函数:

  1. BOOL SEARCH::OnInitDialog()
  2. {
  3. CDialog::OnInitDialog();
  4. // TODO: Add extra initialization here
  5. m_ctrList.InsertColumn(0," 序号");
  6. m_ctrList.InsertColumn(1," 学号");
  7. m_ctrList.InsertColumn(2," 姓名");
  8. m_ctrList.InsertColumn(3," 科目");
  9. m_ctrList.InsertColumn(4," 成绩");
  10. m_ctrList.InsertColumn(5," 补考成绩");
  11. m_ctrList.InsertColumn(6," 缺考标志");
  12. m_ctrList.SetColumnWidth(0,60);
  13. m_ctrList.SetColumnWidth(1,80);
  14. m_ctrList.SetColumnWidth(2,80);
  15. m_ctrList.SetColumnWidth(3,100);
  16. m_ctrList.SetColumnWidth(4,80);
  17. m_ctrList.SetColumnWidth(5,80);
  18. m_ctrList.SetColumnWidth(6,60);
  19. m_ctrList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
  20. CString strSQL="select * from score";
  21. RefreshData(strSQL);
  22. return TRUE; // return TRUE unless you set the focus to a control
  23. // EXCEPTION: OCX Property Pages should return FALSE
  24. }

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

  1. void SEARCH::RefreshData(CString strSQL)
  2. {
  3. m_ctrList.DeleteAllItems();
  4. m_ctrList.SetRedraw(FALSE);
  5. UpdateData(TRUE);
  6. if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
  7. {
  8. MessageBox(" 打开数据库失败!"," 数据库错误",MB_OK);
  9. return ;
  10. }
  11. int i=0;
  12. char buffer[20];
  13. while(!m_recordset.IsEOF())
  14. {
  15. _ltoa(m_recordset.m_ID,buffer,10);
  16. m_ctrList.InsertItem(i,buffer);
  17. m_ctrList.SetItemText(i,1,m_recordset.m_code);
  18. m_ctrList.SetItemText(i,2,m_recordset.m_name);
  19. m_ctrList.SetItemText(i,3,m_recordset.m_subject);
  20. _ltoa(m_recordset.m_score,buffer,10);
  21. m_ctrList.SetItemText(i,4,buffer);
  22. _ltoa(m_recordset.m_makeup_score,buffer,10);
  23. m_ctrList.SetItemText(i,5,buffer);
  24. m_ctrList.SetItemText(i,6,m_recordset.m_absent);
  25. i++;
  26. m_recordset.MoveNext();
  27. }
  28. m_recordset.Close();
  29. m_ctrList.SetRedraw(TRUE);
  30. }

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

  1. void SEARCH::OnBnClickedButtonSearch()
  2. {
  3. // TODO: Add your control notification handler code here
  4. UpdateData();
  5. CString strSQL,strTemp;
  6. strTemp="";
  7. BOOL bHaveCon = FALSE;
  8. if(m_strSubject!="")
  9. {
  10. strSQL.Format("select * from score where subject = '%s' ",m_strSubject);
  11. bHaveCon = TRUE;
  12. }
  13. if(m_strName!="")
  14. {
  15. if(bHaveCon)
  16. {
  17. strTemp.Format(" name = '%s' ",m_strName);
  18. strSQL=strSQL+ " and " + strTemp;
  19. }
  20. else
  21. {
  22. strSQL.Format("select * from score where name = '%s' ",m_strName);
  23. }
  24. bHaveCon=TRUE;
  25. }
  26. if(m_strClass!="")
  27. {
  28. if(bHaveCon)
  29. {
  30. strTemp.Format(" class = '%s' ",m_strClass);
  31. strSQL=strSQL+ " and " + strTemp;
  32. }
  33. else
  34. {
  35. strSQL.Format("select * from score where class = '%s' ",m_strClass);
  36. }
  37. bHaveCon=TRUE;
  38. }
  39. if(!bHaveCon)
  40. {
  41. strSQL="select * from score";
  42. }
  43. RefreshData(strSQL);
  44. }

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

  1. void SEARCH::OnButton1Delete()
  2. {
  3. // TODO: Add your control notification handler code here
  4. int i = m_ctrList.GetSelectionMark();
  5. if(0>i)
  6. {
  7. AfxMessageBox(" 请选择一条记录进行查看!");
  8. return;
  9. }
  10. CString strSQL;
  11. /*strSQL.Format("select * from score where ID = '%s'",m_ctrList.GetItemText(i,0));*/
  12. /* strSQL.Format("select * from score where ID = '%d'",m_ctrList.GetSelectionMark());*/
  13. strSQL.Format("select * from score where ID=%s",m_ctrList.GetItemText(i,0));
  14. if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
  15. {
  16. AfxMessageBox(" 打开数据库失败!");
  17. return ;
  18. }
  19. m_recordset.Delete();
  20. m_recordset.Close();
  21. strSQL= "select * from score";
  22. RefreshData(strSQL);
  23. }

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

添加相应控件,如下图:

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

  • 在SEARCH.h添加:#include “ScoreSet.h”

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

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

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

  1. void SEARCH::OnButton1Modify()
  2. {
  3. // TODO: Add your control notification handler code here
  4. SCORE_UP_Dialog Dlg;
  5. UpdateData();
  6. int i = m_ctrList.GetSelectionMark();
  7. if(0>i)
  8. {
  9. AfxMessageBox(" 请选择一条记录进行修改!");
  10. return;
  11. }
  12. /* Dlg.m_strCode=m_ctrList.GetItemText(i,0);*/
  13. /* Dlg.m_ID=m_ctrList.GetItemText(i,0);*/
  14. if(IDOK==Dlg.DoModal())
  15. {// 修改记录
  16. CString strSQL;
  17. /* strSQL.Format("select * from student where code = '%s'",Dlg.m_strCode);*/
  18. strSQL.Format("select * from score where ID=%s",m_ctrList.GetItemText(i,0));
  19. /* strSQL.Format("select * from score where ID=%s",Dlg.m_ID);*/
  20. if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
  21. {
  22. AfxMessageBox(" 打开数据库失败!");
  23. return ;
  24. }
  25. m_recordset.Edit();
  26. /* CString m_str_Score;*/
  27. // m_recordset.m_code =Dlg.m_strCode ;
  28. // m_recordset.m_name =Dlg.m_strName ;
  29. // m_recordset.m_sex =Dlg.m_strSex ;
  30. // m_recordset.m_birthday =Dlg.m_tmBirth ;
  31. // m_recordset.m_department =Dlg.m_strDepartment ;
  32. // m_recordset.m_major =Dlg.m_strMajor ;
  33. // m_recordset.m_class =Dlg.m_strClass ;
  34. // m_recordset.m_phone =Dlg.m_strPhone ;
  35. // m_recordset.m_address =Dlg.m_strAddress ;
  36. /* m_recordset.m_ID=Dlg.Dlg.m_ID;*/
  37. /* m_recordset.m_ID=m_ctrList.GetItemText(i,0);*/
  38. /* itoa(Dlg.m_strSCore,m_strScore,10);*/
  39. m_recordset.m_score=Dlg.m_str_Score;
  40. m_recordset.m_makeup_score=Dlg.m_str_Makeup;
  41. m_recordset.Update();
  42. m_recordset.Close();
  43. strSQL= "select * from score ";
  44. RefreshData(strSQL);
  45. }
  46. }

调用该对话框:

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

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操作的了。。虽然叫我不参照别人的代码我还是不会做。。

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

上传的附件 cloud_download 基于MFC和Access数据库实现的学生学习成绩信息管理系统.7z ( 4.77mb, 9次下载 )
error_outline 下载需要10点积分

发送私信

走在一起是缘分,一起在走是幸福

21
文章数
20
评论数
最近文章
eject