目录
1 系统设计
在数据库系统开发的前期,一般要对系统的开发目的、使用对象、实现的功能等进行详细的分析,确定系统的开发方案。
- 系统功能分析
- 系统功能模块设计
- 操作流程图
1.1 系统功能分析
1.1.1 开发目的:
学生信息管理系统的开发目的是管理全校学生的各种信息,方便学生信息的查询。系统的使用对象是学生管理部门,如教务处工作人员、校院系领导、班主任、教师等。所开发的系统的主要使用对象是教务处。
1.1.2 主要功能:
- 学生基本信息的录入,包括:学号、姓名、性别、院系、年龄等;
- 学生信息设置管理,学生基本信息的增加、修改和删除等;
- 学生信息的查询;
- 课程信息的录入,包括:课程号、课程名、先行课、学分等;
- 课程设置管理,包括课程的增加、修改和删除等;
- 课程信息的查询;
- 成绩信息的录入,包括:学号、课程号、成绩等;
- 成绩设置管理,包括成绩的增加、修改和删除等;
- 成绩信息的查询;
- 绩点表信息的录入,包括:绩点号、绩点数、下限分、上限分、备注等;
- 绩点表的查询;
- 科目表信息的录入,包括:院系、院系名等;
- 科目表的查询。
1.2 系统功能模块设计
根据系统所要实现的功能,按照结构化程序设计的原则,可以将整个系统划分为若干个功能模块。功能模块设计图如下所示:
1.3 操作流程图
通过操作流程分析,不但可以具体化系统的功能模块的组成,还可以明确系统中的数据流程,明确系统中所要保存的数据以及数据间的关系,为下一步的数据库设计打好基础。
2 数据库设计
数据库是信息管理系统的基础,在系统中占有重要的地位,数据库结构是否合理直接关系到系统功能的实现和运行的效率。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整性和一致性,也有利于系统的编程实现。
数据库系统设计一般包括如下几个步骤:
- 需求分析;
- 概念结构设计;
- 逻辑结构设计;
- 物理结构设计;
- 应用程序设计及调试;
- 性能测试与确认。
2.1 数据库需求分析
需求分析是整个数据库设计过程中最重要的步骤之一,是后续各阶段的基础。在需求分析阶段,需要从多方面对整个系统进行调查,收集和分析系统对信息和处理两个方面的需求。
收集资料是数据库设计人员和用户共同完成的。必须强调用户的参与,这是数据库应用系统设计的特点。收集资料的目的是明确用户的需求,用户的需求主要包括以下三个方面:
1、信息需求,用户要从数据库获取的内容
2、处理需求,即完成什么处理功能以及采用何种处理方式
3、安全性及完整性需求
分析的过程是对所收集的数据进行抽象的过程。抽象是对实际事物或事件的人为处理,抽取共同的本质特征,忽略细微末节,并用各种概念进行精确描述,这些概念组成某种数据模型。
在对学生信息管理系统操作流程分析的基础上,可以列出以下学生信息管理系统所需的数据项和数据结构:
1、学生基本信息设置:学号、姓名、性别、院系、年龄等;
2、课程信息设置:课程号、课程名、先行课、学分等;
3、成绩信息设置:学号、课程号、成绩等;
4、绩点表设置:绩点号、绩点数、下限分、上限分、备注等;
5、科目表设置:院系、院系名等。
2.2 数据库概念结构设计
E-R模型(Entity-Relationship Module)简称E-R图,是描述概念世界,建立概念模型的实用工具。数据库设计工作比较复杂,将现实世界的数据组织成符合具体数据库管理系统所采用的数据模型一般情况下不可能一次到位,P.P.S.Chen于1976年提出形象的实体-联系方法。通过绘制E-R图,可以描述组织模式,并可以进一步转化为任何一种SQL Sever所支持的数据模型。E-R图有三要素:
1、实体:用矩形框表示,框内标注实体名称
2、属性:用圆角矩形表示,并用连线与实体连接起来,表示实体的有关属性
3、实体间的联系:用菱形框表示,框内注明联系名称,并用连线将菱形框与有关实体连接,在连线上注明联系的类型
在关系复杂的数据库系统的设计中,E-R图的设计包括局部E-R图设计、综合E-R图设计、E-R图优化等步骤。本系统的学生信息管理系统功能比较简单,其E-R图如图所示:
2.3 数据库逻辑结构设计
概念结构设计的结果得到一个与计算机、软硬件的具体性能无关的全局概念模式。数据库逻辑设计的任务是将概念结构转换成特定SQL Sever所支持的数据库模型。从E-R图所表示的概念模型可以转换成任何一种具体SQL Sever所支持的数据模型。本系统采用关系模型,转换的原则是:
1、每个实体转化成一个关系模式(即数据表),实体的属性就是关系的属性,实体的关键字就是关系的关键字;
2、每个1:1的联系转换成一个关系模式。每个实体的关键字都是该关系模式的候选关键字;
3、每个1:n的联系转换成一个关系模式。多方的实体的关键字是该关系模式的关键字;
4、每个m:n的联系转换成一个关系模式。联系中各实体关键字的组合组成该关系模式的组合关键字;
5、具有相同关键字的关系可以合并。
在进行完概念结构的转化以后,还需要进行规范化处理,通过模式合并和模式分解,优化数据逻辑结构,使数据库既能有效减少冗余信息,又能提高数据库的查询、操纵性能。
根据学生信息管理系统的E-R图,通过简单的优化,可以设计5个关系模式(即数据表)来存储所有的信息。5个数据表的结构如表1到5所示:
表1 学生基本信息表(Student)
字段名 | 数据类型(长度) | 必添字段 | 说明 |
Sno | Char(9) | 是 | 学号(主关键字) |
Sname | Char(20) | 否 | 姓名 |
Ssex | Char(2) | 否 | 性别 |
Sage | Smallint | 否 | 年龄 |
Sdept | Char(20) | 否 | 院系 |
表2 课程基本信息表(Course)
字段名 | 数据类型(长度) | 必添字段 | 说明 |
Cno | Char(4) | 是 | 课程号(主关键字) |
Cname | Char(40) | 否 | 课程名 |
Cpno | Char(4) | 否 | 先行课 |
Ccredit | Smallint | 否 | 学分 |
表3 成绩基本信息表(SC)
字段名 | 数据类型(长度) | 必添字段 | 说明 |
Sno | Char(9) | 是 | 学号(主关键字) |
Cno | Char(4) | 是 | 课程号 |
Grade | Smallint | 否 | 成绩 |
表4 绩点表(jdb)
字段名 | 数据类型(长度) | 说明 |
Jdh | Int | 绩点号 |
Jds | float | 绩点数 |
Xxf | Numeric(4,1) | 下限分 |
Sxf | Numeric(4,1) | 上限分 |
Bz | Char(20) | 备注 |
表5 科目表(Dept)
字段名 | 数据类型(长度) | 必添字段 | 说明 |
Sdept | Char(20) | 是 | 院系 |
Pname | Char(20) | 否 | 院系名 |
2.4 数据库结构的实现
数据库逻辑结构设计完成以后,就可以在SQL Sever上创建数据库和数据表了。一般情况下可以根据SQL Sever的SQL语法建立相应的SQL语句,并将数据库文件命名为xscj。数据库设计相应的SQL语句如下所示:
create database xscj
go
use xscj
go
if exists (select * from sysobjects where xtype='U' and name='sc')
drop table sc;
if exists (select * from sysobjects where xtype='U' and name='course')
drop table course;
if exists (select * from sysobjects where xtype='U' and name='student')
drop table student;
if exists (select * from sysobjects where xtype='U' and name='dept')
drop table dept;
if exists (select * from sysobjects where xtype='U' and name='jdb')
drop table jdb;
go
GO
-- 课程信息表;
CREATE TABLE Course (
Cno char (4) NOT NULL ,
Cname char (40) NULL ,
Cpno char (4) NULL ,
Ccredit smallint NULL
) ON [PRIMARY]
GO
-- 学生信息表;
CREATE TABLE Student (
Sno char (9) NOT NULL ,
Sname char (20) NULL ,
Ssex char (2) NULL ,
Sage smallint NULL ,
Sdept char (20) NULL
) ON [PRIMARY]
GO
-- 成绩信息表;
CREATE TABLE SC (
Sno char (9) NOT NULL ,
Cno char (4) NOT NULL ,
Grade smallint NULL
) ON [PRIMARY]
GO
-- 绩点表;
create table JDB(
jdh int primary key,
jds float ,
xxf numeric(4,1) ,
sxf numeric(4,1) ,
bz char(20)
);
GO
-- 科目表;
CREATE TABLE Dept (
sdept char (20) NOT NULL ,
pname char (20) NULL
) ON [PRIMARY]
ALTER TABLE Dept WITH NOCHECK ADD
CONSTRAINT PK_Dept PRIMARY KEY CLUSTERED
(
sdept
) ON [PRIMARY]
GO
ALTER TABLE Course WITH NOCHECK ADD
CONSTRAINT PK_CNO PRIMARY KEY CLUSTERED
(
Cno
) ON [PRIMARY]
GO
ALTER TABLE Student WITH NOCHECK ADD
CONSTRAINT PK_SNO PRIMARY KEY CLUSTERED
(
Sno
) ON [PRIMARY]
GO
ALTER TABLE SC WITH NOCHECK ADD
CONSTRAINT PK_SCNO PRIMARY KEY CLUSTERED
(
Sno,
Cno
) ON [PRIMARY]
GO
ALTER TABLE Course ADD
UNIQUE NONCLUSTERED
(
Cname
) ON [PRIMARY]
GO
--删除一个约束定义
--ALTER TABLE Student Drop CONSTRAINt DF_Student_Sname
ALTER TABLE Student ADD
CONSTRAINT DF_Student_Sname DEFAULT ('') FOR Sname,
--Drop CONSTRAINt DF_Student_Sname DEFAULT for sname
UNIQUE NONCLUSTERED
(
Sname
) ON [PRIMARY]
GO
setuser
GO
--绑定默认值给表字段
--EXEC sp_bindefault N'nullchar', N'Course.Cname'
--取消绑定
--EXEC sp_unbindefault 'Course.Cname'
GO
setuser
GO
ALTER TABLE Course ADD
CONSTRAINT FK__Course__Cpno FOREIGN KEY
(
Cpno
) REFERENCES Course (
Cno
) NOT FOR REPLICATION
GO
ALTER TABLE Student ADD
CONSTRAINT FK_Student_Dept FOREIGN KEY
(
Sdept
) REFERENCES Dept (
sdept
) ON UPDATE CASCADE
GO
ALTER TABLE SC with nocheck ADD
CONSTRAINT FK_SC_Course FOREIGN KEY
(
Cno
) REFERENCES Course (
Cno
) ON UPDATE CASCADE ,
CONSTRAINT FK_SC_Student FOREIGN KEY
(
Sno
) REFERENCES Student (
Sno
) ON UPDATE CASCADE
alter table Course nocheck constraint FK__Course__Cpno
GO
--表的检查约束
ALTER TABLE SC ADD
CONSTRAINT CK_Grade CHECK (grade>=0 AND Grade<=100)
创建xscj数据库的表结果如下:
2.5 初始数据的录入
在某些数据库系统的开发中,需要录入一些初始据。在完成数据库的创建以后,便可以在SQL Sever中录入初始数据。SQL语句如下:
-- 插入绩点表数据;
insert into jdb
select 1 , 4 , 90 , 100, 'A(优)' union
select 2 , 3.7 , 87 , 89.9, 'A-' union
select 3 , 3.3 , 84 , 86.9 ,'B+' union
select 4 , 3 , 81 , 83.9 ,'B(良)' union
select 5 , 2.7 , 78 , 80.9 ,'B-' union
select 6 , 2.3 , 75 , 77.9 ,'C+' union
select 7 , 2 , 72 , 74.9 ,'C(中)' union
select 8 , 1.7 , 69 , 71.9 ,'C-' union
select 9 , 1.3 , 66 , 68.9 ,'D+' union
select 10 , 1 , 60 , 65.9 ,'D' union
select 12 , 0 , 0 , 59.9 ,'F(不及格)' ;
--插入Dept表数据
insert Dept(sdept,pname) values( 'CS' ,'计算机科学系' )
insert Dept(sdept,pname) values( 'IS' ,'信息工程系' )
insert Dept(sdept,pname) values( 'MA' ,'物理系' )
-- 插入Student表数据;
insert Student(Sno,Sname,Ssex,Sage,Sdept) values('200215121','李勇','男',20,'CS')
insert Student(Sno,Sname,Ssex,Sage,Sdept) values('200215122','刘晨','女',19,'IS')
insert Student(Sno,Sname,Ssex,Sage,Sdept) values('200215123','王敏','女',18,'MA')
insert Student(Sno,Sname,Ssex,Sage,Sdept) values('200215125','张立','男',19,'IS');
-- 插入Course表数据;
insert Course(Cno,Cname,Cpno,Ccredit) values('6','数据处理',NULL,2)
insert Course(Cno,Cname,Cpno,Ccredit) values('2','数学',NULL,2)
insert Course(Cno,Cname,Cpno,Ccredit) values('7','PASCAL语言','6',4)
insert Course(Cno,Cname,Cpno,Ccredit) values('5','数据结构','7',4)
insert Course(Cno,Cname,Cpno,Ccredit) values('1','数据库','5',4)
insert Course(Cno,Cname,Cpno,Ccredit) values('3','信息系统','1',4)
insert Course(Cno,Cname,Cpno,Ccredit) values('4','操作系统','6',3);
-- 插入SC表数据;
insert sc(Sno,Cno,Grade) values('200215121','1',92)
insert sc(Sno,Cno,Grade) values('200215121','2',85)
insert sc(Sno,Cno,Grade) values('200215121','3',88)
insert sc(Sno,Cno,Grade) values('200215122','2',90)
insert sc(Sno,Cno,Grade) values('200215122','3',80);
数据库创建完毕以后,还需要对数据库的性能进行一些测试,以确保数据库设计的合理性,避免在系统软件开发过程中发现数据库不合理而修改数据库。
3 系统主窗体的创建
数据设计完成后,下一步的工作就是使用某种程序开发语言实现系统的具体功能,本系统采用的语言为微软公司的中文版Visual Basic 6.0程序开发语言。
内容包括如下几个方面:
- 创建工程文件
- 主窗体的设计
- 主菜单设计
- 部分程序的实现
3.1创建工程文件
启动Visual Basic 6.0,直接单击【打开】按钮,Visual Basic创建工程文件,并自动产生一个窗体文件。根据Visual Basic配置的不同,有时会出现不同的运行界面,系统会直接创建新的工程文件。
此外,也可以通过单击【文件】→【新建工程】菜单项来创建工程。
为了构造便于用户操作的程序界面,需要在工程中增加相应的部件。单击【工程】→【部件】菜单项,打开“部件”对话框,在“控件”选项卡的列表框中将下面所列控件前面的方框勾选,然后单击“确定”按钮。相应的控件就会被增加到工具箱上。本程序需要增加如下几个部件:
Microsoft DataGrid Control 6.0(OLEDB)
Microsoft Windows Common Controls 6.0(SP4)
在设计复杂的应用程序时,为了方便用户的操作,往往要考虑系统的界面框架结构,常用的框架结构有SDI(单文档界面)和MDI(多文档界面)两种。为简便起见,本系统采用单文档界面。
打开主窗体(文件名为“学生管理系统菜单栏”(Form5)),设置窗体的有关属性。单击【工具】→【菜单编辑器】菜单项,打开菜单编辑器设计窗体的主菜单。为每个菜单项取一个比较有意义的名称。
菜单项名称 | 菜单项数据表 | 说明 |
系统信息查询 | 一级菜单 | |
绩点表查询 | jdbQuery | 二级菜单项 |
科目表查询 | deptQuery | 二级菜单项 |
退出系统 | 二级菜单项 | |
学生信息管理 | 一级菜单 | |
学生信息查询 | studentQuery | 二级菜单项 |
学生管理 | FromStudent | 二级菜单项 |
课程信息管理 | 一级菜单 | |
课程信息查询 | courseQuery | 二级菜单项 |
课程管理 | FromCourse | 二级菜单项 |
学生成绩管理 | 一级菜单 | |
成绩信息查询 | scQuery | 二级菜单项 |
成绩管理 | FromSC | 二级菜单项 |
菜单项编辑的界面图和编辑图,如下所示:
3.4部分程序的实现
先实现退出功能。单击主窗体的“退出系统”菜单项,系统自动生成相应事件过程框架,并切换到代码窗口,增加退出过程代码如下:
Private Sub 退出系统_Click()
cn.Close
End
End Sub
主窗体中其它菜单项功能的实现将在后面介绍。
4 学生信息管理模块
学生信息管理模块是学生信息管理系统的辅助功能模块,实现学生信息增加、修改和删除以及学生信息浏览等功能。
本节内容包括如下几个方面:
- 模块功能分析;
- 窗体的创建;
- 模块用户界面的设计;
- 模块功能的实现。
4.1 模块功能分析
- 实现思路
在窗体上增加控件和数据控件,将其它控件与数据控件绑定,就可以实现学生信息数据的显示和浏览。为了便于用户直观浏览学生信息,本系统采用数据表格的形式显示数据。数据的增加、删除、修改可以通过数据控件和数据绑定控件来实现。
为了验证数据的有效性,保持数据库的完整性,在增加、删除、修改数据时必须对数据进行验证,可以在窗体上再增加一个数据控件,通过它查询相关数据表来验证数据。
在增加记录时,通过字段内容检验来实现域值和非空字段验证,通过对新增加的学生信息编号的查询,验证学生编号的唯一性(记录层验证);在删除记录时,通过查询是否有属于该学生的课程来确保数据的完整性。 - 实现步骤
- 增加、保存窗体,设置窗体属性;
- 增加控件,设置控件属性,构造窗体界面;
- 编写代码,实现相应功能;
- 和主窗体连接,测试模块功能。
4.2 主窗体的设计
在Visual Basic中单击【工程】→【增加窗体】(或者工具栏的“增加窗体”按钮),给工程增加一个新窗体,将窗体保存为FormStudent.frm。
4.3模块用户界面的设计
在窗体上增加若干标签、文本框、按钮,并增加数据表格控件,窗体布局如下图所示:
运行效果如下:
4.4 模块功能的实现
4.4.1 通用变量、通用模块定义
代码如下:
Private Sub DataGrid1_Click()
Textsno.Text = rs1.Fields("sno").Value
Textsname.Text = rs1.Fields("sname").Value
Textssex.Text = rs1.Fields("ssex").Value
Textsage.Text = rs1.Fields("sage").Value
Textsdept.Text = rs1.Fields("sdept").Value
If rs1.RecordCount = 0 Then Exit Sub
If rs1.EOF Then rs1.MoveLast
End Sub
Private Sub Form_Load()
rs1.CursorLocation = adUseClient
rs1.Open "select * from student", cn, adOpenDynamic, adLockOptimistic
Set DataGrid1.DataSource = rs1
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs1.Close
End Sub
同时本模块在同一个用户界面上实现数据的浏览、增加、删除、修改等功能,为了避免用户操作不当而错误修改数据,在浏览数据时应禁止数据的修改;在增加、修改、删除数据时允许用户输入数据并禁止移动记录集指针,可以设置一个通用过程来实现界面的切换。
4.4.2 数据增加功能的实现
增加功能的代码如下:
Private Sub Command1_Click()
sno = Textsno.Text
sname = Textsname.Text
ssex = Textssex.Text
sage = Textsage.Text
sdept = Textsdept.Text
rs1.AddNew
rs1.Fields("sno") = sno
rs1.Fields("sname") = sname
rs1.Fields("ssex") = ssex
rs1.Fields("sage") = sage
rs1.Fields("sdept") = sdept
rs1.Update
DataGrid1.Refresh
End Sub
效果如下:
增加前:
增加后:
4.4.3 数据修改功能的实现
修改功能的代码如下:
Private Sub Command2_Click()
sno = Textsno.Text
sname = Textsname.Text
ssex = Trim(Textssex.Text)
sage = Val(Textsage.Text)
sdept = Textsdept.Text
rs1.Fields("sno") = sno
rs1.Fields("sname") = sname
rs1.Fields("ssex") = ssex
rs1.Fields("sage") = sage
rs1.Fields("sdept") = sdept
rs1.Update
DataGrid1.Refresh
End Sub
效果如下:
修改前:
修改后:
4.4.4 数据记录删除功能的实现
删除功能的代码如下:
Private Sub Command3_Click()
If rs1.RecordCount = 0 Then
MsgBox ("没有要删除的记录")
Exit Sub
End If
Dim str As String
str = MsgBox("确定删除此记录吗?", vbYesNo)
If str = vbYes Then
rs1.Delete
rs1.MoveNext
If rs1.EOF Then rs1.MoveLast
DataGrid1.Refresh
End If
End Sub
效果如下:
删除前:
删除后:
4.4.5 数据记录add和刷新功能的实现
add和刷新功能的代码如下:
Private Sub Command4_Click()
rs1.Close
rs1.Open " select * from student", cn, adOpenDynamic, adLockOptimistic
Set DataGrid1.DataSource = rs1
DataGrid1.Refresh
End Sub
Private Sub Command5_Click()
Dim errloop As ADODB.Error
Dim rsttitles As ADODB.Recordset
sno = Textsno.Text
sname = Textsname.Text
ssex = Trim(Textssex.Text)
sage = Val(Textsage.Text)
sdept = Textsdept.Text
On Error GoTo err_execute
cn.Execute "insert into student(sno,sname,ssex,sage,sdept) values('" & sno & "','" & sname & "','" & ssex & "'," & sage & ",'" & sdept & "')"
On Error GoTo 0
DataGrid1.Refresh
abc = MsgBox("插入数据成功", 64, "提示")
Exit Sub
err_execute:
abc = MsgBox("插入数据出错", 16, "错误")
End Sub
效果如下:
add和刷新前:
add和刷新后:
5 课程管理模块
课程管理模块实现课程增加、删除和修改以及课程信息浏览等功能。
内容包括如下几个方面:
- 模块功能分析;
- 窗体的创建;
- 模块用户界面的设计;
- 模块功能的实现。
5.1 模块功能分析
- 实现思路
课程管理模块的实现和学生管理模块的实现类似。 - 实现步骤
- 增加、保存窗体,设置窗体属性;
- 增加控件,设置控件属性,构造窗体界面;
- 编写代码,实现相应功能;
- 和主窗体连接,测试模块功能。
5.2 主窗体的设计
在工程中新建一个窗体,将窗体保存为FormCourse.frm。
5.3 模块用户界面的设计
在窗体上增加若干标签、文本框、按钮、组合框,并增加数据表格控件。 窗体布局如下图所示:
5.4模块功能的实现
5.4.1 通用变量、通用模块定义
代码如下:
Private Sub DataGrid1_Click()
If rs2.RecordCount = 0 Then Exit Sub
If rs2.EOF Then rs2.MoveLast
Textcno.Text = rs2.Fields("cno").Value
If IsNull(rs2("cpno")) Then Textcpno.Text = 0
If Not IsNull(rs2("cpno")) Then Textcpno.Text = rs2.Fields("cpno").Value
If IsNull(rs2("cname")) Then Textcname.Text = 0
If Not IsNull(rs2("cname")) Then Textcname.Text = rs2.Fields("cname").Value
If IsNull(rs2("ccredit")) Then Textccredit.Text = 0
If Not IsNull(rs2("ccredit")) Then Textccredit.Text = rs2.Fields("ccredit").Value
End Sub
Private Sub Form_Load()
rs2.CursorLocation = adUseClient
rs2.Open "select * from course", cn, adOpenDynamic, adLockOptimistic
Set DataGrid2.DataSource = rs2
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs2.Close
End Sub
其他代码可参考“学生信息管理模块” ,学生信息管理模块实现学生基本信息的增加、修改、删除、浏览等功能。本模块的界面布局和事件处理程序类似于学生信息管理模块,这里只给出界面布局图和效果图。
初始:
增加:
修改:
删除:
6 成绩管理模块
成绩管理模块实现成绩增加、删除和修改以及成绩信息浏览等功能。
内容包括如下几个方面:
- 模块功能分析;
- 窗体的创建;
- 模块用户界面的设计;
- 模块功能的实现。
6.1模块功能分析
- 实现思路
成绩管理模块的实现和学生信息管理模块的实现类似。 - 实现步骤
- 增加、保存窗体,设置窗体属性;
- 增加控件,设置控件属性,构造窗体界面;
- 编写代码,实现相应功能;
- 和主窗体连接,测试模块功能。
6.2主窗体的设计
在工程中新建一个窗体,将窗体保存为FormSC.frm。
6.3模块用户界面的设计
在窗体上增加若干标签、文本框、按钮、组合框,并增加数据表格控件。 窗体布局如下图所示:
6.4模块功能的实现
6.4.1 通用变量、通用模块定义
代码如下:
Private Sub DataGrid1_Click()
Textsno.Text = rs3.Fields("sno").Value
Textcno.Text = rs3.Fields("cno").Value
Textgrade.Text = rs3.Fields("grade").Value
If rs3.RecordCount = 0 Then Exit Sub
If rs3.EOF Then rs3.MoveLast
End Sub
Private Sub Form_Load()
rs3.CursorLocation = adUseClient
rs3.Open "select * from sc", cn, adOpenDynamic, adLockOptimistic
Set DataGrid3.DataSource = rs3
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs3.Close
End Sub
其他代码可参考“学生信息管理模块” ,本模块的界面布局和事件处理程序类似于学生信息管理模块,这里只给出界面布局图和效果图。
初始:
增加:
修改:
删除:
Add和刷新:
7 学生信息查询模块
学生信息查询模块实现对学生信息的查询显示,包括学生基本信息的查询、查询的移动等。
本模块内容包括如下几个方面:
- 模块功能分析;
- 窗体的创建;
- 模块用户界面的设计;
- 模块功能的实现。
7.1 模块功能分析
- 实现思路
学生基本信息存储在Student数据表中。Student数据表中Sno字段存储着学生的编号,姓名、性别、年龄、所属课程等信息则分别保存在Sname、Ssex、Sage、Sdept等字段中。编程时通过将数据控件的数据集类型设置成动态数据集、将数据控件的数据源设置成SQL语句来实现。
7.2 主窗体的设计
在Visual Basic中单击【工程】→【增加窗体】给工程增加一个新窗体,将窗体保存为studentQuery.frm 。
7.3模块用户界面的设计
7.4 模块功能的实现
7.4.1 默认查询功能
点击后默认指向第一项数据,该功能的SQL语句为:
Private Sub Form_Load()
rs6.CursorLocation = adUseClient
rs6.Open "select * from student", cn, adOpenDynamic, adLockOptimistic
Set DataGrid1.DataSource = rs6
rs6.MoveFirst '指针移动到第一条记录。
Textsno.Text = rs6.Fields("sno").Value
Textsname.Text = rs6.Fields("sname").Value
Textssex.Text = rs6.Fields("ssex").Value
Textsage.Text = rs6.Fields("sage").Value
Textsdept.Text = rs6.Fields("sdept").Value
End Sub
7.4.2 查询功能的实现
通过文本框的事件响应用户的操作,当用户在点击“下一项”控件后,数据库中自动移动到下一项数据信息,
“下一项”的SQL语句为:
Private Sub Command1_Click()
If rs6.EOF = False Then
rs6.MoveNext
End If
Textsno.Text = rs6.Fields("sno").Value
Textsname.Text = rs6.Fields("sname").Value
Textssex.Text = rs6.Fields("ssex").Value
Textsage.Text = rs6.Fields("sage").Value
Textsdept.Text = rs6.Fields("sdept").Value
Form6.Refresh
End Sub
效果如下:
“前一项”的SQL语句为:
Private Sub Command2_Click()
If rs6.BOF <> True Then
rs6.MovePrevious
End If
Textsno.Text = rs6.Fields("sno").Value
Textsname.Text = rs6.Fields("sname").Value
Textssex.Text = rs6.Fields("ssex").Value
Textsage.Text = rs6.Fields("sage").Value
Textsdept.Text = rs6.Fields("sdept").Value
End Sub
效果如下:
“第一项”的SQL语句为:
Private Sub Command3_Click()
rs6.MoveFirst
Textsno.Text = rs6.Fields("sno").Value
Textsname.Text = rs6.Fields("sname").Value
Textssex.Text = rs6.Fields("ssex").Value
Textsage.Text = rs6.Fields("sage").Value
Textsdept.Text = rs6.Fields("sdept").Value
Form6.Refresh
End Sub
效果如下:
“最后一项”的SQL语句为:
Private Sub Command4_Click()
rs6.MoveLast
Textsno.Text = rs6.Fields("sno").Value
Textsname.Text = rs6.Fields("sname").Value
Textssex.Text = rs6.Fields("ssex").Value
Textsage.Text = rs6.Fields("sage").Value
Textsdept.Text = rs6.Fields("sdept").Value
End Sub
效果如下:
“退出”的SQL语句为:
Private Sub Command5_Click()
Textsno.Text = rs6.Fields("sno").Value
Textsname.Text = rs6.Fields("sname").Value
Textssex.Text = rs6.Fields("ssex").Value
Textsage.Text = rs6.Fields("sage").Value
Textsdept.Text = rs6.Fields("sdept").Value
Form6.Show
Unload Me
End Sub
8 课程信息查询模块
课程信息查询模块与学生信息查询模块相类似,具体代码参照如上信息,该处只展示课程模块用户界面的设计效果图:
窗体courseQuery.frm
9 成绩信息查询模块
成绩信息查询模块与学生信息查询模块相类似,具体代码参照如上信息,该处只展示成绩模块用户界面的设计效果图:
窗体scQuery.frm
10 绩点表查询和科目表查询
绩点表查询和科目表查询实现对绩点表和科目表的查询显示。
本节内容包括如下几个方面:
- 窗体的创建;
- 模块用户界面的设计;
10.1 主窗体的设计
在Visual Basic中单击【工程】→【增加窗体】给工程增加一个新窗体,将窗体保存为jdbQuery.frm、deptQuery.frm 。
10.2 模块用户界面的设计
11 系统的编译和发行
11.1 系统的编译
所有模块设计完成以后,系统的工程窗口应该如图所示。
单击【运行】→【启动】菜单项(或者按F5功能键),运行程序,输入实验数据,测试系统的功能,如果有任何问题请检查、修改各项设置和程序代码。
系统目前还只能在Visual Basic环境下运行,为了使系统能脱离Visual Basic环境独立运行,必须对系统进行编译。单击【文件】→【生成学生信息管理系统.exe】菜单项,Visual Basic生成一个可执行文件学生信息管理系统.exe,这个文件可以独立于Visual Basic运行了。
11.2系统的运行测试
将学生信息管理系统.exe和学生信息管理系统.mdb复制到任意一个文件夹或者另外的任何一台机器上,双击学生信息管理系统.exe,进行独立运行测试。
在测试系统功能时必须将所有的功能测试到,并测试所有可能出现的操作。开发者一般会按照自己的思维定势测试系统,某些漏洞不容易发现,因此在条件许可的情况下可以请不熟悉本系统开发过程的人帮助测试,尽可能发现程序中的漏洞,以便修补漏洞,完善系统功能。最后还需要请最终用户试用系统,并根据用户的要求调整完善系统的功能。
下面是系统运行测试的具体情况。
其余效果均正常,这里就不重复展示了。
12 小结与提高
12.1 小结
功能完整、性能稳定的学生信息管理系统开发完成了。通过本章的学习,应该掌握数据库系统开发的一般步骤,掌握Visual Basic下使用数据控件以及数据绑定控件开发数据库系统的方法。结合数据库理论,掌握在数据库系统开发中如何实现数据库的完整性。
在系统开发中,不但要考虑系统功能的实现,而且要特别注重系统的稳定性,考虑各种可能导致系统运行异常的因素,并加以排除。此外,还应掌握部分常用控件的使用方法。
12.2 创意与提高
- 系统安全性问题
在系统开发中必须要考虑数据库系统的安全性。一方面,可以给数据库本身增加安全认证和权限控制,具体的实现和SQL Sever有关;另一方面,在系统开发中可以增加用户登录功能,防止无关人员非法使用本系统,并且可以给每个使用者设置不同的权限,防止越权操作系统的某些功能。
- 功能完善
本系统中,为了维护数据库的完整性,对于部分数据采取了“拒绝修改/删除”的办法。这种方法简单易实现,但是不便于用户操作,如何有效实现“级联更新/删除”的功能?系统中很多的代码是重复的,如何减少代码的重复量、提高系统开发、维护的效率?该系统还有待完善。
- 界面改进
本系统的主窗体比较简单,可以给主窗体增加工具栏、状态栏,以方面用户的操作,提供更好的人机界面。在实际的系统开发中还应该给系统设计有代表意义图标,用图片对用户界面进行适当的装饰,美化系统的界面。
- 帮助系统
实际使用的系统中一般都具有比较完备的帮助系统,指导操作者的使用。另外还有“关于”菜单,便于使用者方便了解本系统的版本、开发时间、获取技术支持的途径等。
- 安装程序
系统开发完成以后,还需要给系统制作安装程序,简化系统的安装过程,降低用户手工安装的难度。安装程序可借助专门的安装制作软件制作,也可以自己编程制作安装程序。此外一些压缩软件(如WinRAR)也具备简单的安装程序制作功能。