基于delphi的学生成绩管理系统.docx
《基于delphi的学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《基于delphi的学生成绩管理系统.docx(18页珍藏版)》请在冰豆网上搜索。
基于delphi的学生成绩管理系统
南昌航空大学信息工程学院
数据库原理课程实验报告
实验名称:
学生成绩信息管理系统
实验时间:
2010年6月2日
指导教师:
班级:
学号:
姓名:
成绩:
一、实验目的
(1)通过完成从用户需求分析、系统概要设计、系统详细设计以及数据库的SQL操作具体实现等全过程,把前面的各个实验更好地综合起来.
(2)进一步理解和掌握教材中的相关内容。
(3)掌握分析和设计一个大型数据库系统的基本思路与方法。
二、实验要求
1.独立完成该系统的数据库设计。
2.用SQL实现数据库的设计,并在MSSQLServer上调试通过。
3.写出查询、更新以及建立触发器SQL语句和执行结果。
4.掌握报表的使用。
三、实验内容
综合前面各章内容设计并调试一学生成绩管理系统,Delphi作为前台开发工具,SQLServer完成后台数据库存管理。
创建学生成绩的统计(包括求班级各科成绩的平均分);并实现对各科成绩等的录入、修改、删除、查询等功能;实现学生成绩的统计(包括求班级各科成绩的平均分);并实现对各科成绩的排序。
四、实验代码及功能注释
1.用户登陆界面
实验程序:
procedureTForm1.Button1Click(Sender:
TObject); //用户登陆
varret:
integer;
begin
adoconnection1.Open;
withADOStoredProc1do
begin
Close;
ProcedureName:
='proc_login';
Parameters.Clear;
Parameters.Refresh;
Parameters.ParamByName('@username').Value:
=Edit1.text;
Parameters.ParamByName('@password').Value:
=Edit2.text;
ExecProc;
ret:
=Parameters.ParamByName('@return_value').Value;
end;
ifret=1then//用户名密码匹配
begin
showmessage('登陆成功');
form3.show;
end
else
showmessage('你不是用户,请注册');
end;
procedureTForm1.Button2Click(Sender:
TObject); //若不是用户,触发用户登陆界面显示
begin
form2.show;
end;
procedureTForm1.Button3Click(Sender:
TObject); //退出该管理系统
begin
form1.Close;
end;
说明:
在这里,使用了adostoredproc1控件和adoconnection1控件,它们的connectionstring属性都要与所设计的数据库相连,在查询分析器中,要运行存储过程如下:
CREATEprocedureproc_login
@usernamevarchar(20),
@passwordvarchar(20)
as
declare@resultint
select@result=count(*)fromuserswhereusername=@usernameandpasswords=@password
if@result=0
return0
return1
GO
2.用户注册界面
实验程序:
procedureTForm2.Button1Click(Sender:
TObject);//新用户注册
begin
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('insertintousers(username,passwords,核对密码,性别,出生年月,联系地址,联系电话,邮政编码,电子邮箱)'+'values(:
1,:
2,:
3,:
4,:
5,:
6,:
7,:
8,:
9)');
adoquery1.parameters.parambyname('1').value:
=''+edit1.text+'';
adoquery1.parameters.parambyname('2').value:
=''+edit2.text+'';
adoquery1.parameters.parambyname('3').value:
=''+edit3.text+'';
adoquery1.parameters.parambyname('4').value:
=''+combobox1.text+'';
adoquery1.parameters.parambyname('5').value:
=''+combobox1.text+''+combobox1.text+'';
adoquery1.parameters.parambyname('6').value:
=''+edit4.text+'';
adoquery1.parameters.parambyname('7').value:
=''+edit5.text+'';
adoquery1.parameters.parambyname('8').value:
=''+edit6.text+'';
adoquery1.parameters.parambyname('9').value:
=''+edit7.text+'';
adoquery1.execsql;
end;
说明:
在该数据库中,建了一个名为users的用户表,存储用户的信息。
只有是用户在登陆时,才能进入主界面,当不是用户在登陆时,必须先进行新用户注册,才能进入主系统。
3.系统主界面
4.学生基本信息查询
精确查询程序:
procedureTForm3.Button1Click(Sender:
TObject);
begin
withadoquery1do
begin
ifradiobutton1.Checkedthen//通过单选按钮的选择来判断是要进行精确查询还是模糊查询
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select*from学生表where学号='''+edit1.text+'''');
adoquery1.Open;
end;
end;
说明:
由于学生表中,学号为主键,因此要查此表中学生基本信息,只要输入主键值即可得一条记录,即实现精确查询。
模糊查询程序:
procedureTForm3.Button3Click(Sender:
TObject);
begin
withadoquery1do
begin
ifradiobutton2.Checkedthen
begin
if(edit2.Text<>'')or(edit3.Text<>'')or(edit4.Text<>'')or(edit5.Text<>'')
or(edit6.Text<>'')then
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select*from学生表');
adoquery1.SQL.Add('where(学号like'''+'%'+edit2.text+'%'+''')');
adoquery1.SQL.Add('or(姓名like'''+'%'+edit3.text+'%'+''')');
adoquery1.SQL.Add('or(所在系别like'''+'%'+edit4.text+'%'+''')');
adoquery1.SQL.Add('or(所在专业like'''+'%'+edit5.text+'%'+''')');
adoquery1.SQL.Add('or(所在班级like'''+'%'+edit6.text+'%'+''')');
adoquery1.Open;
end
else
begin
application.MessageBox('没有查询条件','提示',mb_ok);
exit;
end;
end;
end;
end;
说明:
当输入的信息不是主键时,由于满足该输入条件的记录可能不只一个,因此得到的是一个模糊查询的结果。
5.学生成绩查询
方法与学生基本信息查询一致。
6.学生基本信息录入
实验程序:
procedureTForm4.Button1Click(Sender:
TObject);
begin
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('insertinto学生表(学号,姓名,民族,出生年月,籍贯,性别,所在系别,所在专业,所在班级,政治面貌,家庭住址,邮政编码,联系电话)'+'values(:
1,:
2,:
3,:
4,:
5,:
6,:
7,:
8,:
9,:
10,:
11,:
12,:
13)');
adoquery1.parameters.parambyname('1').value:
=''+edit1.text+'';
adoquery1.parameters.parambyname('2').value:
=''+edit2.text+'';
adoquery1.parameters.parambyname('3').value:
=''+edit3.text+'';
adoquery1.parameters.parambyname('4').value:
=''+combobox1.text+''+combobox2.text+'';
adoquery1.parameters.parambyname('5').value:
=''+edit4.text+'';
adoquery1.parameters.parambyname('6').value:
=''+combobox3.text+'';
adoquery1.parameters.parambyname('7').value:
=''+combobox4.text+'';
adoquery1.parameters.parambyname('8').value:
=''+edit5.text+'';
adoquery1.parameters.parambyname('9').value:
=''+edit6.text+'';
adoquery1.parameters.parambyname('10').value:
=''+edit7.text+'';
adoquery1.parameters.parambyname('11').value:
=''+edit8.text+'';
adoquery1.parameters.parambyname('12').value:
=''+edit9.text+'';
adoquery1.parameters.parambyname('13').value:
=''+edit10.text+'';
adoquery1.execsql;
end;
在SQLServer中查看录入结果
录入前:
录入后:
说明:
从录入前与录入后表的比较看到,实现了学号为’’aaa’’学生基本信息的录入。
7.求学生平均成绩、成绩排序并显示
实验程序:
procedureTForm3.Button4Click(Sender:
TObject);
begin
withadoquery1do
begin
ifradiobutton3.Checkedthen //与学生基本信息查询一样,这里为成绩精确查询
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select*from成绩信息表where学号='''+edit9.text+'''');
adoquery1.Open;
end;
ifradiobutton4.Checkedthen //与学生基本信息查询一样,这里为成绩模糊查询
begin
if(edit10.text<>'')or(edit11.Text<>'')or(edit12.Text<>'')or(edit13.Text<>'')
or(edit14.Text<>'')then
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select*from成绩信息表');
adoquery1.SQL.Add('where(学号like'''+'%'+edit10.text+'%'+''')');
adoquery1.SQL.Add('or(姓名like'''+'%'+edit11.text+'%'+''')');
adoquery1.SQL.Add('or(所在系别like'''+'%'+edit12.text+'%'+''')');
adoquery1.SQL.Add('or(所在专业like'''+'%'+edit13.text+'%'+''')');
adoquery1.SQL.Add('or(所在班级like'''+'%'+edit14.text+'%'+''')');
adoquery1.Open;
end
else
begin
application.MessageBox('没有查询条件','提示',mb_ok);
exit;
end;
end;
ifradiobutton9.Checkedthen //求每个学生的课程平均成绩
begin
adoquery1.Close;
sql.Clear;
sql.Add('select学号,姓名,AVG(成绩)as平均成绩from成绩信息表where所在班级=''070413''groupby学号,姓名');
adoquery1.Open;
end;
ifradiobutton11.Checkedthen //将学生成绩按从低到高排序
begin
adoquery1.Close;
sql.Clear;
sql.Add('select学号,姓名,avg(成绩)as平均成绩from成绩信息表groupby学号,姓名orderby平均成绩');
adoquery1.open;
end;
end;
end;
求平均成绩界面与平均成绩排序后界面:
说明:
使用到了数据库的自带函数avg()来求平均成绩,按平均成绩排序时,只要在已经做好的平均成绩显示程序上加上 orderby语句即可。
9.学生基本信息删除与修改
实验程序:
procedureTForm3.Button6Click(Sender:
TObject);
begin
withadoquery1do
begin
ifradiobutton7.Checkedthen
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('update学生表set'+combobox1.text+'='''+edit19.text+'''');//edit19编辑框用来输入要更改的字段名
adoquery1.SQL.Add('where学号='''+edit18.text+'''');
adoquery1.execsql;
end;
ifradiobutton8.Checkedthen
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('deletefrom学生表');不得//删除语句
adoquery1.SQL.Add('where学号='''+edit18.text+'''');
adoquery1.execsql;
end;
修改界面:
在SQLServer中查看修改结果
说明:
比较修改前与修改后学生的表中数据可知,将原来记录中学号为’’aaa’’学生的姓名由’’小小’’改成了’’小麦’’。
删除界面:
在SQLServer中查看删除结果
10.学生成绩信息删除与修改
与学生基本信息删除与修改方法一致。
五、实验小结
本次实验主要复习了delphi的操作界面,控件的使用,及对adoquery的sql的属性的使用,在这个实验中,可以发现delphi与数据库的完美结合,就是说可以通过delphi界面更改数据库的内容,而这是通过编辑adoquery的sql里的内容来实现的,因此几乎每个窗体都有一个adoquery控件。
这个实验的sql语句的编辑全用的是adoquery1.sql.add()语句,括号里的内容就是数据库查询分析器里的内容,在每写入一个语句时,都要把之前写的sql语句删掉,以免执行时出现问题,对于括号里面的select语句,函数有返回值,因此可以用adoquery1.open打开数据源,看到执行后的结果,而对于括号里面的update,delete等语句,函数没有返回值,只能写adoquery1.execsql执行操作,而且只能到数据库的表中看执行后的结果。
编写sql语句是极容易出错的,有时是因为汉英输入法切换后符号不一致所导致,有时是因为sql语句内引号出现的错误,反正就是要熟悉每个用到的sql语句,要清楚在写每个语句时具体的操作是要干什么,它有自己的书写格式。
最后还有一点要注意的是,录入数据时,一定要把主码的值全部录入,且不能与表中已有值重复,否则违反了记录的唯一性,会出错。