用Delphi及SQL Server开发学生成绩管理系统

2012-04-29 20:31吴以林
电脑知识与技术 2012年2期
关键词:数据库

吴以林

摘要:该文介绍了采用Delphi 7及Microsoft SQL Server数据库做为开发工具,开发学生成绩管理系统,内容包括目标与功能结构、数据库设计、SQL存储过程及主要技术特点等。并给出了部分Delphi原程序。

关键词:成绩管理系统;数据库;Delphi;ADO

中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)02-0353-05

目前在计算机技术的迅速发展的前提下以及计算机应用的普遍性,同时为了更好更快的加快学校学生成绩/学籍管理,开发一套成绩/学籍管理系统迫在眉捷。本系统主要采用Delphi 7及SQL Server2000做为开发工具,应用面向对象的程序设计方法进行开发与设计的。利用其提供的集成开发环境及各种控件,尤其是对数据库的支持完成对数据库的各种操作,达到对学生成绩管理的目的。本系统使用ADO连接数据库Microsoft SQL Server,提出了权限管理模块的具体实现方法,并完成了相关软件的设计任务。最终系统能够完成信息的输入、输出、数据的修改、查询和统计等功能,使用户操作起来简便快捷。

1设计概述

本系统由系统(用户登录)、班级管理、课程设置、成绩管理共四个模块组成分别设计应用程序界面。其主要功能框图如图1所示。

图1主要功能框图

2数据库结构设计(数据库采用Microsoft SQL Server数据库)

2.1班级信息数据库(class_info)

2.2学生信息数据库(student_info)

2.3班级课程数据库(classcourse_ifo)

2.4学期成绩数据库(result_ifo)

2.5学期不及格成绩数据库(bujige_ifo)

以上数据库表,通过Microsoft SQL Server数据库关系图功能设置了各表关键字段的关联,即采用了关系性数据的表示方式,如各数据库表class字段的关联、student_ID字段的关联等等,另外学期不及格成绩数据库(bujige_ifo)的数据由系统自动统计“学期成绩数据库”的数据成绩(result)<60自动存入。。

3 SQL存储过程

sql语句执行的时候要先编译,然后执行。存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。下面为系统开发中的部分存储过程代码:

create procedure [Proc_term_result] as

Declare @sql varchar(8000)

set @sql=select SUBSTRING(student_ID,7,3) as学号,student_name as姓名,retire as备注,

select @sql=@sql+cast(max(case course_name when

+course_name+ then Rtrim(result) else end)

as varchar(4))+IsNull((select enable from resultVIEW1

where student_id=b.student_id

and (class=某班) and (academic_year=10/11学年)and (term=下学期期末)

and course_name=+course_name+),)as +course_name+,

from (select distinct course_name from resultVIEW1 where class=某班 and

academic_year=10/11学年and term=下学期期末) as a select @sql=left(@sql,len

(@sql)-1) +from resultVIEW1 as b where class=某班 and academic_year=10/11学年 and term=下学期期末 group by stu?

dent_ID,student_name, retire exec(@sql)

以上SQL存储过程代码,主要是实现行列交叉的功能,即把图2的数据表变成图3的数据表,方便打印及查看。

图2

图3

4程序实现

4.1查询/打印毕业成绩

procedureTF_PtAVGResult.FormCreate(Sender:TObject);

begin

//设置查询年级列表框

withDataModule1.AQ_yeardo

begin

close;

SQL.clear;

SQl.add(select*fromyear_Info);

DataModule1.AQ_year.Open;

CB_year.Items.Clear;

whilenotDataModule1.AQ_year.eofdo

begin

CB_year.Items.Add(Fieldbyname(grade).asString);

next;

end;

end;

end;

procedureTF_PtAVGResult.CB_yearClick(Sender:TObject);

begin

CB_class.Text:=;

withDataModule1.AQ_classdo

//设置查询班级列表框

begin

close;

SQL.clear;

SQL.Add(select*fromClass_infowheregrade=:grade);

parameters.ParamByName(grade).value:=CB_year.Text;

DataModule1.AQ_class.Open;

CB_class.Items.Clear;

whilenotDataModule1.AQ_class.eofdo

begin

CB_class.Items.Add(Fieldbyname(class).asString);

next;

end;

end;

DataModule1.SQLSp.Close;//清空表格

end;

procedureTF_PtAVGResult.CB_ClassClick(Sender:TObject);

begin

DataModule1.SQLSp.Close;//清空表格

withDataModule1.AQ_Ysdo

begin

Close;//创建视图文件“resultVIEW2”

SQL.Clear;

SQL.Add(ifexists(select*fromsysobjectswhere);

SQL.Add(id=object_id(N[dbo].[result_bujigeVIEW2]));

SQL.Add(andOBJECTPROPERTY(id,NIsView)=1));

SQL.Add(dropView[dbo].[result_bujigeVIEW2]);

ExecSQL;

Close;

SQL.Clear;

SQL.Add(CREATEVIEWdbo.result_bujigeVIEW2AS);

SQL.Add(SELECTstudent_ID,student_Name,class,retire,course_name,);

SQL.Add(AVG(result)ASresult1,MAX(enable)ASenable1);

SQL.Add(FROMresult_bujigeVIEW);

SQL.Add(GROUPBYstudent_ID,student_Name,class,retire,course_name);

SQL.Add(HAVING(class=+CB_Class.Text+));

ExecSQL;

Close;

end;

DataModule1.SQLSp.Close;//清空表格

withDataModule1.AQ_Ysdo

begin

Close;

//修改存储过程文件“Proc_AVG_result”的前提

SQL.Clear;

SQL.Add(ifexists(select*fromsysobjectswhere);

SQL.Add(id=object_id(N[dbo].[Proc_AVG_result]));

SQL.Add(andOBJECTPROPERTY(id,NIsProcedure)=1));

SQL.Add(dropprocedure[dbo].[Proc_AVG_result]);

ExecSQL;

Close;

end;

withDataModule1.AQ_MakeupResultdo//修改存储过程文件“Proc_term_result”

begin

close;

SQL.Clear;

sql.Add(createprocedure[Proc_avg_result]as);

sql.Add(Declare@sqlvarchar(8000));

sql.add(set@sql=selectSUBSTRING(student_ID,7,3)as学号,);

sql.Add(student_nameas姓名,retire备注,);

sql.add(select@sql=@sql+cast(max(casecourse_namewhen);

sql.Add(+course_name+thenRtrim(result1)elseend));

sql.Add(asvarchar(4))+IsNull((selectmax(enable1)as标识fromresult_bujigeVIEW2);

sql.Add(wherestudent_id=b.student_idand);

sql.Add((class=+CB_Class.Text+)andcourse_name=+course_name+),));

sql.Add(as+course_name+,);

sql.add(from(selectdistinctcourse_namefromresult_bujigeVIEW2);

sql.Add(whereclass=+CB_Class.Text+)asa);

sql.Add(Declare@subjectcountvarchar(6));

sql.Add(select@subjectcount=count(distinctcourse_name)fromresult_bujigeVIEW2);

sql.Add(select@sql=@sql+(selectsum(result1)fromresult_bujigeVIEW2wherestudent_id=b.student_id)/+@subjectcount+as平均分,);

sql.Add(select@sql=@sql+(selectcast(count(student_ID)asvarchar(4))+科);

sql.Add(fromresult_bujigeVIEW2whereresult1<60andstudent_ID=b.student_ID)as不及格科数+);

sql.Add(fromresult_bujigeVIEW2asb);//whereresult1<60

sql.Add(groupbystudent_ID,student_name,retire);

sql.Add(select@sql=@sql+unionselect各科asstudent_id,合计人数asstudent_name,asretire,);

sql.Add(select@sql=@sql+(selectcast(count(student_id)asvarchar(4)));

sql.Add(+人fromresult_bujigeVIEW2where);

sql.Add(result1<60andcourse_name=+course_name+));

sql.Add(as+course_name+,);

sql.Add(from(selectDistinctcourse_namefromresult_bujigeVIEW2);

sql.Add(whereresult1<60)asa);

sql.Add(select@sql=@sql+as平均分,as不及格科数orderby平均分desc);

sql.Add(exec(@sql));

ExecSQL;

end;

以上程序通过简单的下拉选项选择年级和班级,就以实现查询某班所有学期每门课程的平均成绩情况,显示在屏幕窗口表格里,同时可以直接点打印按钮,将成绩打印出来;也可通过下面成绩另存为程序实现成绩导出。

4.2成绩另存为(或导出)

procedureTF_PtAVGResult.ppmSaveSelectionClick(Sender:TObject);

varExpClass:TDBGridEhExportClass;

Ext:String;

begin

SaveDialog1.FileName:=file1;

if(ActiveControlisTDBGridEh)then

ifSaveDialog1.Executethen

begin

caseSaveDialog1.FilterIndexof

1:beginExpClass:=TDBGridEhExportAsText;Ext:=txt;end;

2:beginExpClass:=TDBGridEhExportAsCSV;Ext:=csv;end;

3:beginExpClass:=TDBGridEhExportAsHTML;Ext:=htm;end;

4:beginExpClass:=TDBGridEhExportAsRTF;Ext:=rtf;end;

5:beginExpClass:=TDBGridEhExportAsXLS;Ext:=xls;end;

else

ExpClass:=nil;Ext:=;

end;

ifExpClass<>nilthen

begin

ifUpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3))<> UpperCase(Ext)then

SaveDialog1.FileName:=SaveDialog1.FileName+.+Ext;

SaveDBGridEhToExportFile(ExpClass,TDBGridEh(ActiveControl),

SaveDialog1.FileName,False);

end;

end;

end;这部分程序与数据浏览窗口放在一起实现了,可以将数据导出生成xls、txt、csv、htm、rtf类型文件。

5主要技术特点

1)本系统适用于软件环境为Win2003/WinXP/Win2000/WinNT/Win9x。

2)系统在设计上按通用性软件的要求,做到了结构良好,数据入或导入灵活、方便。用户在完成原始数据输入或导入后,只需按几下按钮,即可完成对各种数据的处理和要求,并可根据预先定制好的格式生成成绩表。

3)系统采用了多种形式的窗口控制技术和多种容错措施,使软件不仅具有独特的屏幕界面风格,而且较少地占用计算机系统资源,运行快速、安全可靠。

4)系统的数据输入采用键盘输入或从Excel文件、CSV文件导入等多种输入方式,而数据输出采用屏幕显示、打印、直接复制出去及导出生成xls、txt、csv、htm、rtf类型文件等多种输出方式,从面完全可以满足用户的不同需求。

参考文献:

[1]陈豫龙,何旭洪.Delphi数据库系统开发实例导航[M].2版.北京:人民邮电出版社,2003.

[2]张立科.Delphi 7组件编程参考手册[M].北京:人民邮电出版社,2003.

猜你喜欢
数据库
本刊加入数据库的声明
数据库
数据库
数据库
两种新的非确定数据库上的Top-K查询
数据库
数据库
数据库
数据库
数据库