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

简介: 基于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 总体设计

系统模块



be212004f68b28a1b9bc2536ec31d589.png



4 详细设计


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

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

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



a1099e3328095d7c0de8ef3b381ecde4.png

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

50b7aee5027ddb7dac085abe0424cb70.png

重载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

添加相应控件,如下图:


55edcda72b27e82c8de27c01c36fbcd5.png


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


c4d650c12c62137d8ca1c7a2381d575f.png


  • 在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 测试与实现


20db8aef26a017edc73633601a297d92.png


660be49b003e7794f1ee721c69097111.png


31bdc1f9660414fc01e553c6df974939.png


7200cfbe40e583a1a59b1a96f972b764.pngbe9f044550857e4fa8d040df874959e6.png


5da6fc29461fb4c79ae19a0199e48b38.png

6ff25216e1c4ebc5078c619814f85145.png


b09cc3798fa1dec0165e544eacb72302.png


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了,用的是另一个驱动了。


9aa15074cfc9018b49e0bf6a93200f37.png

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


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


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


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


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


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


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

相关文章
|
2月前
|
SQL 存储 关系型数据库
【MySQL 数据库】11、学习 MySQL 中的【锁】
【MySQL 数据库】11、学习 MySQL 中的【锁】
78 0
|
3月前
|
存储 人工智能 Cloud Native
阿里云瑶池数据库训练营权益:《玩转Lindorm》学习资料开放下载!
阿里云瑶池数据库训练营权益:《玩转Lindorm》学习资料开放下载!
|
3月前
|
存储 关系型数据库 MySQL
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
185 0
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL 数据库】4、MySQL 事务学习
【MySQL 数据库】4、MySQL 事务学习
44 0
|
28天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
|
8天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
8天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
2月前
|
SQL 存储 数据可视化
access sql 数据库,Access SQL
access sql 数据库,Access SQL
|
2月前
|
SQL 数据库 内存技术
学习数据库要掌握的54条SQL查询语句
学习数据库要掌握的54条SQL查询语句
15 0
|
2月前
|
存储 SQL 关系型数据库
【MySQL 数据库】6、一篇文章学习【索引知识】,提高大数据量的查询效率【文末送书】
【MySQL 数据库】6、一篇文章学习【索引知识】,提高大数据量的查询效率【文末送书】
59 0