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操作的了。。虽然叫我不参照别人的代码我还是不会做。。
界面不太友好,这个没办法。。我不太会弄这个。。。