用VB6.0配合Access数据库开发学生成绩管理系统,目标是把学生各科成绩的录入、修改、查询和统计工作从手工操作中解放出来。系统运行在Windows环境下,使用VB6.0企业版和Access 2003数据库,整个开发周期约三周,实际代码量不到两千行,最终实现了学生信息维护、成绩录入、成绩查询、成绩统计和数据备份五个功能模块。
数据库设计是系统的核心。创建名为score.mdb的Access数据库,其中学生成绩表students包含学号、姓名、语文、数学、英语、总分、平均分七个字段。学号是文本类型,长度10位,设为主键,保证每个学生只能有一条成绩记录。语数英三科均为整数,范围0到100。总分和平均分采用冗余存储,这样在显示成绩列表时不需要实时计算,直接读取字段值即可,查询速度明显提升。Access对单表几万条记录的处理绰绰有余,本系统设计容量为五千人,实际测试中插入一千条记录后,查询时间仍在半秒内。
VB6.0连接数据库使用ADO技术。在工程中引用Microsoft ActiveX Data Objects 2.8 Library,通过Connection对象建立连接。连接字符串为“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\score.mdb;Persist Security Info=False”。App.Path指向程序所在目录,避免写死绝对路径,方便程序拷贝到其他电脑上运行。记录集采用Recordset对象,游标类型选用adOpenKeyset,锁类型为adLockOptimistic,既能滚动浏览又能实时更新。
成绩录入界面左侧放置DataGrid控件绑定数据库,右侧是学号、姓名、语文、数学、英语五个文本框和添加、修改、删除三个命令按钮。添加新记录时,先检查学号是否为空,再检查学号是否重复。使用SQL语句“SELECT * FROM students WHERE 学号=''" & txt学号.Text & "''”查询,若记录集不为空则提示学号已存在。然后验证三科成绩是否在0到100之间,不符合时弹出警告并中止操作。验证通过后执行以下代码:
```vb
Set rs = New Recordset
rs.Open "SELECT * FROM students", conn, adOpenKeyset, adLockOptimistic
rs.AddNew
rs.Fields("学号") = txt学号.Text
rs.Fields("姓名") = txt姓名.Text
rs.Fields("语文") = Val(txt语文.Text)
rs.Fields("数学") = Val(txt数学.Text)
rs.Fields("英语") = Val(txt英语.Text)
rs.Fields("总分") = Val(txt语文.Text) + Val(txt数学.Text) + Val(txt英语.Text)
rs.Fields("平均分") = rs.Fields("总分") / 3
rs.Update
rs.Close
```

总分和平均分在添加时自动计算,不需要用户输入。修改操作类似,先根据当前DataGrid选中行的学号定位记录,再更新各字段,同时重新计算总分和平均分。删除操作要求用户确认,防止误删,执行“DELETE FROM students WHERE 学号=''" & rs.Fields("学号") & "''”即可。
成绩查询模块提供了按学号精确查询和按姓名模糊查询两种方式。模糊查询的SQL语句是“SELECT * FROM students WHERE 姓名 LIKE ''%" & txt关键字.Text & "%''”,结果集显示在另一个DataGrid中。查询结果支持导出到Excel,利用VB6的OLE功能调用Excel.Application,把记录集逐行写入工作表,这一功能在实际考试后统计班级成绩时非常实用。
成绩统计模块使用SQL聚合函数。计算全班平均分时执行“SELECT AVG(语文), AVG(数学), AVG(英语) FROM students”,统计及格人数使用“SELECT COUNT(*) FROM students WHERE 语文>=60”。每科成绩的最高分、最低分和优秀率也通过类似语句获得。统计结果直接输出到文本框,同时生成一个简单的柱状图显示在PictureBox控件上,柱状图通过画矩形实现,每个柱子的高度按成绩比例换算。
系统测试阶段录入了一个班级五十名学生的真实期末考试成绩。录入过程中发现学号输入时有全角数字混入的情况,导致查询不到数据。解决方法是在文本框的KeyPress事件中过滤掉全角字符,只允许半角数字和字母。另一个问题是删除最后一条记录后DataGrid刷新不及时,出现空白行,需要在删除后重新设置RecordSource属性并调用Refresh方法。经过修复后连续运行七十二小时无异常,程序占用的内存稳定在十二兆左右。
整个系统最终交付给教务处使用。操作人员经过十五分钟培训就能独立完成所有日常操作。相比原来手工登记Excel表格的方式,录入效率提高约三倍,统计平均分和及格率从原来的逐一计算变为一键生成。系统源代码结构清晰,各模块之间通过标准模块中的公共函数传递数据,为后续扩展到多学年成绩对比、自动生成成绩单等功能留下了接口。