实习三 开发出一个小型学生信息管理系统
随着学校的规模不断扩大,学生数量急剧加,有关学生的各种信息量也成倍增长,面对庞大的信息量,就需要有学生信息管理系统来提高学生管理工作的效率。通过这样的系统,可以做到信息的规范管理、科学统计和快速的查询,从而减少管理方面的工用量。
一、概述
1、项目背景:数据库原理课程上机实验
2、编写目的:掌握数据库设计原理及相关软件的使用
3、软件定义:学生信息管理系统
4、开发环境:Microsoft Visual Studio C++ 6.0 和Microsoft SQL Server
二、基本要求
(1)实现学生基本信息录入、查询和修改功能;
(2)实现课程基本信息录入、查询和修改功能;
(3)实现学生选课信息录入、查询和修改功能;
(4)实现一些常用的学生管理的多表查询;
(5)尝试打印报表的设计。
三、建库的方法和步骤
需求分析,概念结构设计,逻辑结构设计,数据结构设计,数据库实施,数据库运行和维护
四、算法思想
(1)设计思想:
数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率以用实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。同时,合理的数据库结构也将有利于程序的实现。
设计数据库时应该首先充分了解用户各个方面的需求,包括现有的以及将来可能增加的需求。
用户的需求具体体现在各种信息的提供、保存、更新、和查询,这就要求数据库结构能充分满足各种信息的输出和输入。收集基本数据、数据结构以及数处理的流程,组成一份详尽的数据字典,为后面的具体设计打下基础。
在仔细分析调查有关学生信息需要的基础上,将得到如图3-2所示的本系统所处理数据流程。
整个数据交换过程如下图
针对一般学生信息管理系统的需求,能过对学生学习过程的内容和数据流程分析,设计如面所示的数据项和数据结构:
student:|学号|姓名|性别|年龄|所在系|
course:|课程号|课程名|任课老师|学分|
sc: |学号|课程号|考试成绩|平时成绩|总成绩|补考|重修|
(2)设计表示:
得到上面的数据项和数据结构以后,就可以设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。这些实体包含各种具体信息,通过相互之间的作用形成数据的流动。
本实例根据上面的设计规划出的实体有:学生实体、课程实体、成绩实体。各个实体具体的描述E-R图如下。
(3)详细设计表示:
现在需要将上面的数据库概念结构转化为SQL Server 2000数据库系统所支持的实际数据模型,也就是数据库的逻辑结构。在上面的实体以及实体之间关系的基础上,开成数据库中的表格以及各个表格之间的关系。
学生信息管理系统数据库中各个表格的设计结果如下面的几个表格所示。每个表格表示在数据库中的一个表。如下三个表(表3-1, 表3-2, 表3-3)
主要步骤:
1、 建立好上面表示的E-R图的数据库(三个表,五个视图,一个关系图,两个用户)
2、 数据库与MFC相连的问题:我们用ODBC以及ODBC驱动,用户使用DBMS数据库管理功能生成新的数据库模式后,就可以使用ODBC来登陆数据源。ODBC是一种应用程序编程接口,可以利用它与SQL语法相结合,与多个DBMS通信,一种用来在相关或不相关的数据库管理系统中存取数据标准应用程序接口(API),关于接口代码请看附件。
3、 根据上面的数据交换过程设计登陆后的用户界面以及各个界面里面的窗口控件
4、 进一步对每个窗口控件进行消息响应(即每个控件代码)
5、程序调试以及各个功能进一步的完善
五、调试报告
1、首先得设计好表和视图以及关系图,各个表的主键的属性一定要保持一直,在调试过程中修改表的数据时,出现无法修改,原因就是我们在插入数据时,用“Ctrl+C” 和“Ctrl+V”,经常复制的数据长度超过规定的(其实不是,是复制过长的空格),数据库对空格很敏感。
2、如何建立一个好的用户界面,关键在于数据库的视图,MFC程序的编写是围绕视图来设计界面和控件。方便用户访问、查找、新增、修改。例如:用户只需查看补考通知单,那就只显示补考同学的信息就可以了,没有必要把全部学生成绩信息显示给用户。
3、MSSQL数据库与MFC连接方式,是采用ODBC还是DAO,我采用的是ODBC,因为它的效率更高些。
4、至于MFC程序的编写过程,要细心和耐心就可以了。
5、但是这个系统缺陷就是不能很好的推广,因为它的使用,需要用户会配置数据库服务器,对数据库有所了解,这就是ODBC的缺点,改进就是采用DAO接口,采用Microsoft Access的.mdb数据库的应用程序与MFC相结合,开发一个学生信息管理系统的网页,方便用户的使用和推广。
六、用户手册
使用说明:
**操作执行:
1.还原数据库:
企业管理器->数据库->所有任务->附加数据库(选择"SQL数据库"里的 Gem_Data.MDF)
还原后的数据库名为:Gem.
2.新建登陆:
确保数据库没有ctfysj和Student两个用户,若有,则先删除它们,然后复制 new.sql里的语句在查询 分析器里执行,数据库选择Gem,执行完毕后将会自动创建上面两个用户,并给予权限.ctfysj的角色是 db_owner,能执行数据库的所有维护活动;Student的角色是db_datareader和db_denydatawriter,只能读数据,不能更新数据。
3.启动服务器:
选择服务器为(local)
4.运行程序:
用户名: Student 密码:gem
或者 用户名(管理员):Gem 密码:gem
**异常操作:
若执行new.sql不能新建登陆,则用户可以自己新建登陆,用户名和密码可以自己定义, 用户权限则要自己选择.
注:MSSQL使用混合登陆,否则ctfysj和Student帐号不能够正常登陆 或者 使用信任连接;可执行文件Gem本人加壳了,请不要破解。
如有疑问,请联系~~~ 寞寞无敌 QQ:391502069
个人主页: http://hexun.com/ctfysj 有详细介绍
七、附录
数据表:student,course,sc
student:
|学号|姓名|性别|年龄|所在系|
sc:
|学号|课程号|考试成绩|平时成绩|总成绩|补考|重修|
视图:
v_bukaotongzhi ,v_chongxiutongzhi,v_course,v_student,v_sc
视图:
v_bukaotongzhi ,v_chongxiutongzhi,v_course,v_student,v_sc
SQL语言创建:
SELECT dbo.sc.学号, dbo.student.姓名, dbo.student.所在系, dbo.sc.课程号,
dbo.course.课程名, dbo.course.学分, dbo.sc.总评成绩
FROM dbo.sc INNER JOIN
dbo.course ON dbo.sc.课程号 = dbo.course.课程号 INNER JOIN
dbo.student ON dbo.sc.学号 = dbo.student.学号
WHERE (dbo.sc.补考 = 1)
运行数据:
SQL语言创建:
SELECT dbo.sc.学号, dbo.student.姓名, dbo.student.所在系, dbo.sc.课程号,
dbo.course.课程名, dbo.course.学分, dbo.sc.总评成绩
FROM dbo.sc INNER JOIN
dbo.course ON dbo.sc.课程号 = dbo.course.课程号 INNER JOIN
dbo.student ON dbo.sc.学号 = dbo.student.学号
WHERE (dbo.sc.重修 = 1)
运行数据:
视图v_course、v_student、v_sc 的数据和创建就不在赘述了
三个数据表student,course,sc之间的关系图StuCourse:
student:|学号|姓名|性别|年龄|所在系|
course:|课程号|课程名|任课老师|学分|
sc: |学号|课程号|考试成绩|平时成绩|总成绩|补考|重修|
对于关系模式student:(|学号|姓名|性别|年龄|所在系|),假定姓名也具有唯一性,那么student就有两个码,这两个码都由单个属性组成,彼此不相交。其它属性不存在对码的传递依赖与部分依赖,又因为student中除学号、姓名外没有其它的因素,所以student属于BCNF;对于关系模式course:(|课程号|课程名|任课老师|学分|)中,它只有一个码,这里没有任何属性对课程号部分依赖或传递依赖,同时课程号是唯一的决定因素,所以课程属于BCNF;对于关系模式sc:(|学号|课程号|考试成绩|平时成绩|总成绩|补考|重修|)有两个码,这两个码都由单个属性组成,彼此不相交,其它属性不存在对码的传递依赖与部分依赖,又因为成绩中除学号、课程号外没有其它的决定因素,所以成绩属于BCNF。
视图,索引,数据库权限:
exec sp_addlogin 'ctfysj','gem','Gem'
exec sp_addlogin 'Student','gem','Gem'
use Gem
go
exec sp_grantdbaccess N'ctfysj'
exec sp_grantdbaccess N'Student'
exec sp_addrolemember N'db_owner', N'ctfysj'
exec sp_addrolemember N'db_datareader', N'Student'
exec sp_addrolemember N'db_denydatawriter', N'Student'
在查询分析器里面执行上面的代码,进行修改和创建数据库权限
程序代码及控件描述
启动封面:(m_hIcon)
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
Open事件代码:
BOOL XZ::OnInitDialog()
{
CDialog::OnInitDialog();
::CoInitialize(NULL);
xzyhm=zyhm;
xzmm=zmm;
try
{
m_DBCnt.CreateInstance(__uuidof(Connection));
CString strCn;
strCn.Empty();
strCn="driver={SQL Server};server=(local);"
+xzyhm
+";"+xzmm
+";database=Gem";
m_DBCnt->Open(_bstr_t(strCn),_bstr_t(""),_bstr_t(""),-1);
}
catch(_com_error&e)
{
AfxMessageBox("无法连接数据库!");
this->EndDialog(0);
}
m_bk=false;
m_cx=false;
Readstuxh();
Readcourkch();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
主程序窗口(w_main):
title=“信息管理系统 ”
包含菜单m_main
窗口(w_infoinput)
Open事件代码:
dw_1.SetTransObject(SQLCA)
dw_1.Retrieve()
控件datawindow的dataobject属性:i_info(一个freeform风格的数据窗口对象,显示info表的全部列)
commandbutton(text属性:保存)clicked事件的代码:dw_1.Update()
commandbutton(text属性:取消)clicked事件的代码:dw_1.Retrieve()
commandbutton(text属性:插入)clicked事件的代码:dw_1.InsertRow(dw_1.GetRow())
commandbutton(text属性:删除)clicked事件的代码:dw_1.DeleteRow(dw_1.GetRow())
窗口(w_scoreinput)
Open事件代码:
dw_1.SetTransObject(SQLCA)
dw_1.Retrieve()
控件datawindow的dataobject属性:i_score (一个freeform风格的数据窗口对象,显示exam表的全部列)
commandbutton(text属性:保存)clicked事件的代码:dw_1.Update()
commandbutton(text属性:取消)clicked事件的代码:dw_1.Retrieve()
commandbutton(text属性:插入)clicked事件的代码:dw_1.InsertRow(dw_1.GetRow())
commandbutton(text属性:删除)clicked事件的代码:dw_1.DeleteRow(dw_1.GetRow())
窗口(w_query)
控件statictext的text属性:“请输入学号:”
控件groupbox包含24个statictext控件,它们的text属性分别对应info表的字段名和查询结果
控件SingleLineEdit的text属性为null
commandbutton(text属性:查询)clicked事件的代码:
Connect;
if SQLCA.SQLCode<0 then
MessageBox("连接错误",SQLCA.SQLErrText,Exclamation!)
end if
//MessageBox("done",SQLCA.SQLErrText,Exclamation!)
int Stu_id
string Stu_name,Stu_xuehao,Stu_sex,Stu_age,Stu_home
string Stu_birth,Stu_depart,Stu_price,Stu_info,Stu_health
Stu_id=Integer(sle_id.Text)
select info.sno,info.sname,info.sex,info.age,
info.depart,info.prize,info.exp,info.home,
info.health,info.grade,info.class,info.other
Into :Stu_sno,:Stu_sname,:Stu_sex,:Stu_age,
:Stu_depart,:Stu_prize, :Stu_exp,:Stu_home,
:Stu_health,:Stu_grade:Stu_class, :Stu_other
From student Where info.sno=:Stu_id;
IF SQLCA.SQLCode=100 THEN
MessageBox("学生查询","对不起,没有该学生")
ELSEIF SQLCA.SQLCode>0 THEN
MessageBox("数据库错误",SQLCA.SQLErrText,Exclamation!)
END IF
窗口(w_squery)
控件groupbox(text属性为:“选择查询模式”)包含2个RadioButton控件,它们的text属性分别为按年级查询和按班级查询
控件SingleLineEdit(text属性为Null)功能为获得输入的年级/班级编号
控件CommandButton(text属性为确定)的Clicked事件代码:
integer n
integer slen
slen=Len(sle_1.text)
n=asc(sle_1.text)-48
if (slen>1 or slen=0) then
messagebox("错误","数据非法!")
sle_1.text=""
elseif (n<1 or n>9) then
messagebox("错误","数据非法!")
end if
connect using SQLCA;
if rb_1.checked=true then
select info.sno,info.sname,exam.cno,course.cname,exam.score
from info,course,exam
where info.sno =exam.sno and ,exam.cno =course.cno and info.grade=n
end if
if rb_2.checked=true then
select info.sno,info.sname,exam.cno,course.cname,exam.score
from info,course,exam
where info.sno =exam.sno and ,exam.cno =course.cno and info.class=n
end if
窗口(w_table)
控件SingleLineEdit(text属性为Null)功能为获得输入的年级/班级编号
控件CommandButton(text属性为确定)的Clicked事件代码:
integer n
integer slen
slen=Len(sle_1.text)
n=asc(sle_1.text)-48
if (slen>1 or slen=0) then
messagebox("错误","数据非法!")
sle_1.text=""
elseif (n<1 or n>9) then
messagebox("错误","数据非法!")
end if
connect using SQLCA;
if rb_1.checked=true then
select * from dep_exam,info where info.grade=n
end if
if rb_2.checked=true then
select * from dep_exam,info where info.class=n
主菜单(m_main)代码:
退出系统clicked事件的代码:close(w_main)
学生基本信息输入clicked事件的代码:Open(w_infoinput)
学生成绩输入clicked事件的代码:Open(w_scoreinput)
学生基本信息查询clicked事件的代码:Open(w_query)
学生成绩查询clicked事件的代码:Open(w_squery)
报表clicked事件的代码:Open(w_table)
主要程序清单,详细的内容请看原程序:
成绩管理系统.dsp
成绩管理系统.h
成绩管理系统.cpp
成绩管理系统.rc
成绩管理系统.clw
res\成绩管理系统.ico
res\成绩管理系统.rc2
测试数据和运行结果数据
软件还有各种功能如:打印报表,数据库备份和还原等等,详情自己运行调试。
七、设计心得
通过这次课程设计,我更加熟练的掌握了使用MSSQL进行数据库软件开发的方法,加深了对数据库课程知识的理解。由于时间仓促,软件还有很多不足之处,如:成绩查询部分不够完善,软件代码交冗余、效率不高等等,都是对MFC操作不够熟练,对相关功能缺乏认识造成的。在今后的学习中我会加强理论与实践的结合,通过不断的摸索来弥补自己在软件设计和制作方面的差距。而且数据库的设计和MFC编程过程中,要事先准备好资料画好图和设计好界面,还需要细心和耐心。
下载地址:
http://download1.gbaopan.com/68ba671f68894dafb4d12568eec498a2.gbp?supplierID=1683469
论文(完整版)下载地址:
http://download1.gbaopan.com/68e201d2d7fc44feb58eb71dd8feb5fa.gbp?supplierID=1683469
对不起大家,由于G宝盘被sina收购,改变了以前文件上传和存储的方式和要求,导致我 的文件被删除,现在已经找不到"完整版报告",现在我只能把学生信息管理系统工程和软件上传到新的地址,如有需要,请下载:
学生信息管理系统:
ftp://ctfysj.kongjian.in:******@ctfysj.kongjian.in/视频教学文件/学生信息管理系统C++和SQL Server.rar
******是密码,为了隐私,勿诉于人,如你需要,请回复
密码:
**** 本内容跟帖回复才可浏览 *****
即将推出"学生信息管理系统MFC+SQL Server" 视频教程,将完成这个任务完整的操作录下来,供大家参考学习.如有需要,请回复邮箱.
更多内容请关注太阳湾官方网站 :http://www.rrbay.com