1、数据库应用课程设计说明书 班级: 软件工程1404 姓名:徐螣学号: 201426811322 设计题目: 学生成绩管理系统(数据库)设计时间: 2017.6。25至 2017。7。6指导教师:廖峰峰学生成绩管理系统(数据库)设计总说明 考虑到高校学生的成绩管理工作量大、繁杂,人工处理非常困难,出现了学生成绩管理系统。它借助于计算机强大的处理能力,大大减轻了管理人员的工作量,并提高了处理的准确性。学生成绩管理系统的开发运用,实现了学生成绩管理的自动化,不仅把广大教师从繁重的成绩管理工作中解脱出来、把学校从传统的成绩管理模式中解放出来,而且对学生成绩的判断和整理也更合理、更公正,同时也给教师提供
2、了一个准确、清晰、轻松的成绩管理环境。 本系统根据我校的一些实际情况开发,用于对学校教师、学生、课程信息的管理,主要用于管理学生成绩.登录系统时需要访问数据库中的用户信息,确定登录身份。系统完成了日常的教育工作中对学生成绩档案的数字化管理,并且较为系统地对学生信息、成绩信息和课程信息进行管理。查询、增添、修改、删除都变的非常简便,减少了管理的工作量。 基于学校学生众多,为了数据的安全性,系统将学生数据保存在数据库中,以Visual C+设计前台对系统进行设计。因为成绩管理系统是一项很实用的系统,所面对的数据量很大,所以我们要求系统能够高效快速的处理这些数据,并且要保证数据的正确性、相容性和安全
3、性。C+作为前台是将数据库中的数据读取出来,有助于用户对这些数据进行相应的操作,使操作更方便,更符合用户的要求。所以该系统应该要有一个良好的界面,使用户感觉很直观,使用快捷,这就是用C+所要实现的功能.关键词 Visual C+ 6。0;SQL Server;MFC;学生成绩管理前 言本课程设计是在学习了数据库系统和C语言等有关课程后,通过实际的操作来熟悉数据库和相关软件的应用,培养独立的完成对相关课题或者项目的分析能力、设计能力和调试能力。成绩管理系统登录须有数据库中的账号信息,如无用户可及时注册。系统可以对不同的项目进行查询、添加、修改、删除等操作,方便学校的成绩管理。课程设计,着重培养的
4、是学生的自学能力,以及独立分析互联网上和图书馆里的各种资料,用来丰富自己的知识并且提高对SQL、VC+等软件的实际操作能力.通过这次的课程设计,使我们对已经学习过的数据库课程的进一步的掌握,对知识进行最大程度的消化融汇.因此这次的课程设计对我们来说具有非常重要的作用:为以后学习工作做必要的准备和实践,提高自身对数据库开发的能力。第1章数据库总体设计与实施1数据库设计1.1概念分析:概念结构设计阶段是整个数据库设计的关键,它通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型。 设计成绩管理数据库包括系别、教研室、班级、教师、学生、课程、成绩七个关系。E-R图2。1。1和图2
5、。1。2所示。图2。1。1 实体及其属性图图2。1。2完整的实体联系图1.2逻辑设计: 逻辑结构是独立于任何一种数据模型的信息结构.逻辑结构的任务是把概念结构设计阶段设计好的基本ER图转化为宜选用的DBMS所支持的数据模型相符合的逻辑结构,并对其进行优化。设计学生成绩管理数据库,包括系别、教研室、班级、教师、学生、课程、成绩七个关系,考虑到数据库完整性,其关系模式中对每个实体定义的属性如下:系别表系别:(系号,系名)教研室表教研室:(教研室号,教研室名)班级表班级:(班号,班名,系号)教师表教师:(教师号,姓名,教研室号)学生表学生:(学号,姓名,性别,班号)课程表课程:(课程号,课程名,教师
6、号,学时,学分)成绩表成绩:(学号,课程号,成绩)为了存放前台用户信息再添加一用户表用户表用户:(用户名,密码)1.3物理设计: 定义每个表的数据类型以及字段限制,使数据库达到一定的完整性。每个表的物理设计如下:表2。1。1 系别表字段名数据类型字段限制系号char(2)Primarykey系名char(20)Not null表2。1。1 教研室表字段名数据类型字段限制教研室号char(10)Primarykey教研室名char(20)Not null系号char(10)Not null表2.1.3 班级表字段名数据类型字段限制班号char(10)Primarykey班名char(14)Not
7、 null系号char(10)Not null表2。1。4教师表字段名数据类型字段限制教师号char(5)Primarykey教师姓名char(6)Not null教研室号char(10)Not null表2.1。5学生信息表字段名数据类型字段权限学号char(14)Primarykey姓名char(6)Not null性别char(2)Not null班号char(10)Not null表2.1。6课程表字段名数据类型字段权限课程号char(5)Primary key课程名char(20)Not null教师号char(5)Not null学时IntNot null学分char(3)Not
8、null表2.1。7成绩表字段名数据类型字段权限学号char(14)Primary key课程号char(5)Primary key成绩char(3)Not null表2。1。8用户表字段名数据类型字段权限用户名char(20)Primary key密码char(20)Not null第2章 数据库的实施 2。1创建数据库在SQL2000中的企业管理器中,新建一个数据库,名为“student1”,在查询分析器中 新建数据表。 2.2创建表同样在查询分析器中键入如下代码完成表的创建。 create table 学生( 学号 char(14) not null primary key, 姓名 ch
9、ar(6)not null, 性别 char(2)not null,班号 char(10)not null) create table 教师( 教师号 char(5) not null primary key, 姓名 char(6)not null, 教研室号 char(4)not null) create table 课程( 课程号 char(5) not null primary key, 课程名 char(20)not null, 教师号 char(5)not null, 学时 int not null, 学分 char(3)not null) create table 成绩( 学号 c
10、har(14) not null, 课程号 char(5)not null, 成绩 char(3)not null primary key(学号,课程号)) create table 用户( 用户名 char(20) not null primary key, 密码 char(20) not null)第3章 前台设计与实现3 导入数据库数据并链接BOOL CMyDlg:OnInitDialog()/CDialog::OnInitDialog();/ Add About。 menu item to system menu.m_db。Open(_T(”ODBC;DSN=student1));m_
11、userrs.m_pDatabase=&m_db;/ IDM_ABOUTBOX must be in the system command range。ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)CString strAboutMenu;strAboutMenu。LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty())pSy
12、sMenu-AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small iconreturn TRUE;
13、/ return TRUE unless you set the focus to a control3。1登录模块3。1。1登录运行程序首先要通过登录,登录的用户名和密码存于数据库中用户表中。 输入用户名和密码还有用户的类型从而进入程序.当用户名与密码不匹配时提示错误.void CMyDlg:OnOK() / TODO: Add extra validation hereUpdateData(true);if(!m_userrs.IsOpen())m_userrs。Open();m_userrs.m_strFilter。Format(”用户名=s and 密码=%s,m_username,m
14、_pass);m_userrs.Requery();tryif(m_username=”)AfxMessageBox(”请输入用户名!);return ;if(m_userrs.IsEOF())AfxMessageBox(密码错误!”);return ;else CDialog:OnOK();CMain1Dlg main1dlg;main1dlg。DoModal();catch(CException e)e-ReportError();return;3.1。2为了使系统美观,可通过设置背景图片来改变系统样式.(1)实现方法如下:引入一张要加入的图片,在要添加图片的对话框类向导中Messages
15、中选择WM_PAINT对其编辑,在OnPaint()函数中加入如下代码:CPaintDC dc(this);CRect rect;GetClientRect(&rect); CDC dcMem;dcMem。CreateCompatibleDC(dc);CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP3);BITMAP bitmap;bmpBackground。GetBitmap(bitmap);CBitmap *pbmpOld=dcMem.SelectObject(bmpBackground);dc。StretchBlt(0,
16、0,rect。Width(),rect.Height(),dcMem,0,0,bitmap.bmWidth,bitmap。bmHeight,SRCCOPY); (2)为了将界面设计更加美观,更加人性化,适合用户,将按钮加入图片。代码实现如下:在OnInitDialog中加入: HBITMAP hBitmap,hBitmap1; hBitmap= LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1); ((CButton *)GetDlgItem(IDOK))SetBitmap(hBitmap); hBitmap1=Load
17、Bitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP2)); ((CButton *)GetDlgItem(IDCANCEL)-SetBitmap(hBitmap1); return TRUE; / return TRUE unless you set the focus to a control界面运行如下:登录界面的用户名通过数据库访问代码如下:在BOOL CMyDlg:OnInitDialog()中加入 CDialog::OnInitDialog(); m_db.Open(_T(ODBC;DSN=student1”));m_us
18、errs.m_pDatabase=m_db;3.2系统的详细设计3.2。1主界面设计主界面添加了菜单栏,用于各种信息查询操作和软件帮助信息。通过引入图片设置对话框背景图片。主界面如图3.2.1所示.3。2。2菜单栏和查询设计菜单栏前两个菜单都为查询菜单,通过SQL查询语句显示查询结果。初始化状态为显示全部结果,若记录太多可按主码值查询,若要返回初始状态,点击刷新按钮即可.可以为每个窗口设置适当的图片背景.1. 查询菜单2 成绩查询(1)按学号查询(2) 按班级查询(3) 按课程查询3 信息查询(1) 学生信息(2) 教师信息(3) 课程信息3。2.3管理模块设计(1)总的管理模块设计(2)学生
19、管理模块设计(3) 教师管理模块设计(4) 学生成绩管理模块(5)课程信息管理模块(6)全部显示、增加.删除、修改的功能第4章 代码设计4。1查询4。1.1成绩查询(按学号)void CStudentNumSearchDlg:OnOK() / TODO: Add extra validation hereUpdateData(TRUE);/ TODO: Add your control notification handler code hereCDatabase database;database。Open(student1”,FALSE,FALSE,”ODBC;,FALSE);CStrin
20、g str;CRecordset set(&database);if(m_studentnum。IsEmpty()MessageBox(”请输入学号”);return;m_liststu1。DeleteAllItems();set。Open(CRecordset:dynaset,_T(select 学生.学号, 学生。姓名, 课程。课程名, 成绩.成绩 from 学生, 成绩, 课程 where 学生.学号 = 成绩。学号 and 成绩.课程号 = 课程。课程号 and 学生。学号 = ”+m_studentnum+ order by 成绩。成绩 desc));int i=0;while(!s
21、et。IsEOF()m_liststu1。InsertItem(i,”);CString str1,str2,str3,str4;set。GetFieldValue(”学号”,str1);m_liststu1。SetItemText(i,0,str1);set。GetFieldValue(姓名”,str2);m_liststu1.SetItemText(i,1,str2);set.GetFieldValue(”课程名,str3);m_liststu1。SetItemText(i,2,str3);set.GetFieldValue(”成绩,str4);m_liststu1。SetItemText
22、(i,3,str4);set。MoveNext();i+;set。Close();UpdateData(TRUE);database.Close();BOOL CStudentNumSearchDlg:OnInitDialog() / TODO: Add extra initialization hereCDialog::OnInitDialog();m_liststu1。InsertColumn(1,学号”,LVCFMT_LEFT,100,0);m_liststu1。InsertColumn(2,”姓名,LVCFMT_LEFT,100,0);m_liststu1。InsertColumn(3
23、,课程,LVCFMT_LEFT,100,0);m_liststu1.InsertColumn(4,”成绩”,LVCFMT_LEFT,100,0);return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE4.1。2查询信息(学生信息)void CStudentInfoDlg::OnOK() / TODO: Add extra validation hereUpdateData(TRUE);/ TODO: Add your
24、control notification handler code hereCDatabase database;database。Open(”student1”,FALSE,FALSE,”ODBC;”,FALSE);CString str;CRecordset set(database);if(m_studentnum。IsEmpty()MessageBox(”请输入学号);return;m_liststu4.DeleteAllItems();set。Open(CRecordset::dynaset,_T(select 学生。学号, 学生。姓名, 学生.性别, 学生。班号 from 学生 w
25、here 学生.学号 = +m_studentnum+”);int i=0;while(!set。IsEOF())m_liststu4.InsertItem(i,”);CString str1,str2,str3,str4;set.GetFieldValue(”学号,str1);m_liststu4。SetItemText(i,0,str1);set.GetFieldValue(”姓名”,str2);m_liststu4。SetItemText(i,1,str2);set。GetFieldValue(”性别”,str3);m_liststu4。SetItemText(i,2,str3);set
26、。GetFieldValue(班号,str4);m_liststu4。SetItemText(i,3,str4);set。MoveNext();i+;set。Close();UpdateData(TRUE);database。Close();BOOL CStudentInfoDlg:OnInitDialog() CDialog::OnInitDialog();/ TODO: Add extra initialization herem_liststu4。InsertColumn(0,学号”,LVCFMT_LEFT,100,0);m_liststu4。InsertColumn(1,”姓名,LVC
27、FMT_LEFT,100,0);m_liststu4。InsertColumn(2,性别”,LVCFMT_LEFT,100,0);m_liststu4。InsertColumn(3,”班号,LVCFMT_LEFT,100,0);return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE4.2管理系统4.2.1学生信息管理BOOL CStudentManagementDlg:OnInitDialog() /设置表格类型,样式
28、CDialog:OnInitDialog();/ TODO: Add extra initialization here CStudentRS m_Set; unsigned i=0;CODBCFieldInfo Info;m_Set。Open();m_ListCtrlx。SetExtendedStyle(LVS_EX_FULLROWSELECTLVS_EX_GRIDLINES);for( i=0;iShow();void CStudentManagementDlg:OnAdd() /添加/ TODO: Add your control notification handler code he
29、re CAddDlg dlg;if( dlg。DoModal()=IDOK) if(!m_Set。IsOpen())m_Set.Open(); m_Set。AddNew(); m_nRecordCount+=1; m_Set。m_column1=dlg.m_nxue; m_Set。m_column2=dlg.m_strname; m_Set.m_column3=dlg。m_sex; m_Set.m_column4=dlg。m_class; /thisEqual(); m_Set。Update();/Update()放在Equal()后 m_Set.Requery(); thisXuan();
30、void CStudentManagementDlg:OnDelete() /删除/ TODO: Add your control notification handler code herePOSITION pos=m_ListCtrlx。GetFirstSelectedItemPosition();if(pos=NULL)MessageBox(”请选择你要删除的一行”);return ;int nIndex=m_ListCtrlx。GetNextSelectedItem(pos);CString str=m_ListCtrlx。GetItemText(nIndex,0);if(Messag
31、eBox(你确定要删除”+str+”这行数据吗?,删除功能”,MB_OKCANCEL)!=IDOK)return ;if(!m_Set。IsOpen())m_Set。Open(); m_Set。MoveFirst();BOOL sel=FALSE;doif(m_Set。m_column1!=str)m_Set。MoveNext(); elsem_nRecordCount-=1;sel=TRUE;m_Set。Delete();m_Set。Requery();break;while(!m_Set.IsEOF());if(sel=FALSE)AfxMessageBox(”没有此记录”);return
32、;elsethisXuan();void CStudentManagementDlg::OnChange() /修改 CChangeDlg dlg;if(dlg.DoModal()!=IDOK)return;/如果没有点“确定”,则退出。POSITION pos=m_ListCtrlx。GetFirstSelectedItemPosition();if(pos=NULL)/MessageBox(”请选择你要删除的一行”);return ;int nIndex=m_ListCtrlx.GetNextSelectedItem(pos);CString str=m_ListCtrlx。GetItem
33、Text(nIndex,0);if(!m_Set。IsOpen())m_Set.Open(); m_Set。MoveFirst();BOOL sel=FALSE;doif(m_Set。m_column1!=str)m_Set。MoveNext(); else m_nRecordCount-=1;sel=TRUE;m_Set。Delete();m_Set.Requery();break;while(!m_Set.IsEOF(); m_Set。AddNew(); m_nRecordCount+=1; m_Set。m_column1=dlg。m_nxue; m_Set。m_column2=dlg.m
34、_strname; m_Set。m_column3=dlg。m_sex; m_Set。m_column4=dlg。m_class; /this-Equal(); m_Set。Update();/Update()放在Equal()后 m_Set.Requery(); thisXuan();int CStudentManagementDlg:Show()/控制输出 int k=0; do CString s; s.Format(”s”,m_Set。m_column1); m_ListCtrlx。InsertItem(k,s,0); m_ListCtrlx.SetItemText(k,1,m_Set
35、.m_column2); s。Format(”s”,m_Set.m_column3); m_ListCtrlx。SetItemText(k,2,s); s。Format(”s”,m_Set。m_column4); m_ListCtrlx。SetItemText(k,3,s); k+; m_Set.MoveNext(); while(!m_Set.IsEOF(); m_Set.Close(); return k;void CStudentManagementDlg:Xuan() m_ListCtrlx。DeleteAllItems(); thisShow();第5章 课程任务分析在这次课程设计中
36、,我是自己一个人独立完成,虽然过程比较辛苦,但最终完成了课程设计的研究,整体的分析。首先是课程设计的概念结构设计,数据库的前台设计与实现,所有界面的总体设计,其中菜单栏,教师信息管理主要是一开始就完成的,还通过PS获得了自己的界面,来改变系统样式.然后是数据库的逻辑设计,查询信息设计包括学生信息,教师信息,课程信息,管理模块设计中的课程信息管理,学生成绩管理.最后主要数据库的物理设计数据库的实施,创建数据库,创建表,登陆模块的设计,学生信息管理,退出系统,查询成绩,课程报告文档的设计。总 结通过这一个月的时间终于完成了对学生成绩管理系统的设计开发,并且系统的基本的功能已经实现.我觉得数据库设计
37、比较完美,查询、修改都很方便。系统本身也不仅仅局限于成绩的管理,更有教师、课程等的管理。比较完善的实现了学生成绩的数字化管理。课程设计之前我们很担心想象的系统无法实现预期效果,但是在不断的努力和勇敢的尝试下终于在期待中完成了任务.这个程序下来,总结了一些经验就是,要明白自己做的是什么,对系统有一个清晰的概念。虽然系统功能没有我实际中的完美,尚有欠缺,但我们已经觉得挺满意了,因为我在这个课程设计中学到很多在书本上没有的东西.虽然课程设计虽然结束了,但是我的系统没有结束。我会在以后的生活中继续完善它。以前C+课程设计做的很不好,功能单一。当然那时候对C+语言本身不是很精通。能力是一个不断提高的过程
38、,不能急于求成.我现在正在学习C,那么接下来,我也可以用C#来学着做这个系统。在这两周的学做课程设计中,我收获了很多。因为这次课程设计设计的知识面非常广。从数据库方面来说,涉及到数据库设计的五个步骤:需求分析、概念结构设计、逻辑结构设计、物理结构设计和运行调试。数据库的设计严重影响着系统的功能,如果数据库设计不够合理,前台操作就不能正常运行。在运行过程中我发现数据库的设计比较合理,查询时特别方便。这为以后的开发积累了很宝贵的经验.从MFC编程方面来说又对MFC编程有了进一步的提高,让系统不再单调,通过有关设置使系统更为个性化.通过 MFC 程序来访问并修改数据库,从中体会到了编程的乐趣。看到自
39、己开发的系统实现了一个又一个功能,会有一种特别快乐的感觉。学以致用,这才是学习的目的。当然,系统的开发离不开好的资料和同学的交流。在这次课程设计中深深感受到了同学之间交流合作的重要性。交流不但可以发现新的问题,提高解决问题的效率,而且可以快速的学习到新的知识。比如说,以前我们各自在自己的寝室里面学习的时候,每次遇到问题就在那里翻书,希望能找到解决问题的方法,但是一般都会以不了了之而告终,自从有了这个团队,每次遇到问题的时候,我们都会一起讨论,一起分析,没想到问题很快就解决了,并且我们感觉越讨论越有趣,还希望以后能像现在这样经常在一起谈论问题。最后感谢这次课程设计中给予我帮助的老师和同学,是你们的帮助才使我们的系统更加的强大.参 考 文 献1陈根才 孙建伶 林怀忠 周波 数据库课程设计 M 杭州:浙江大学出版社,20072王瑞 Visual C+ 据库系统开发完全手册 M. 北京:人民邮电出版社, 20063 陈品华 SQL Server数据库系统技术 M。 陕西:西安电子科技大学出版社, 2008.