第 18章 SQL Server 应 用 实例 18-1 数 据 库规划与设计
18-2 SMIS需求分析 与 功能 结构
18-3 SMIS数 据 结构设计 及 实现
18-4 SMIS应 用程序的 编 制
18-5 SQL Server 数 据 库对 象 设计数据库设计是数据库应用的关键技术。本章首先介绍了数据库设计的基本过程,而后基于数据库设技术和 SQL Server 2000知识系统地介绍了学生管理信息系统实例的需求分析、功能结构、数据结构设计与具体实现、
应用程序的编制等内容。
第 18章 SQL Server 应 用 实 例数 据 库设计 是 数 据 库应 用的 关键 技 术 。本章首先介 绍 了 数 据 库设计 的基本 过 程,
而后基于 数 据 库设 技 术 和 SQL Server 2000知 识 系 统 地介 绍 了 学 生管理信息系 统实 例的需求分析、功能 结构,数 据 结构设计与 具体 实现,应 用程序的 编 制等 内 容。
18-1 数 据 库规划与设计数据库规划与设计是数据库应用、信息系统开发和建设的关键问题与核心技术。数据库规划是确定整个系统的数据信息需求,完成系统下数据库及其对象的的设计、系统中关键实体的梳理、属性和它们的组成关系等。数据库设计是指在一个给定的应用环境下,确定一个最优数据模型和处理模式,建立数据库及其应用系统,使之能够安全、有效、可靠地存储数据,满足各种用户的应用需求。数据库设计的内容主要包括两个方面:
其一是结构设计,即设计数据库框架或数据库结构;其二为行为设计,也就是应用程序和事务处理等的设计。数据库设计方法较多,不同法其设计数据库系统的步骤划分也各不相同。著名的新奥尔良方法将数据库设计划分为需求分析、概念设计、逻辑设计和物理逻辑设计四个步骤。随着数据库设计技术的发展与完善,人们又据此导出了新的、更贴近实际的设计步骤。通常采用六个步骤的数据库设计方法,即需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施、数据库运行和维护,图 18-1所示为数据库设计的过程。
物理 设计物理 结构设计设计,性能 预测需求分析概 念 结构设计逻辑设计逻辑结构设计数 据模型 优 化数 据 库实 施物 理 实 现试验 性 运 行数 据 库运 行和 维护图 18-1 数 据 库设计过 程
18-1-1 需求分析用户对数据库的使用要求主要包括对数据及其处理的要求,对数据完整性、安全性的要求。在需求分析阶段主要通过仔细调查准确掌握每一个用户对数据库的要求,
提供后续设计阶段所需的一些内容,主要涉及应用环境分析、数据流程分析、数据需求的收集与分析等。需求分析是整个设计过程的基础,是最困难、最耗损时间的一步,其准确与否将直接影响后 续各个设计阶段。最终将影响到设计结果是否合理和实用。
18-1-2 概 念 结构设计在准确抽象出现实世界的需求并完成需求设计后,就可以考虑如何实现用户的具体要求,进行概念设计了 。 该阶段要做的各种工作不是直接将需求分析得到的数据存储格式转换成数据库管理系统 ( DBMS) 能处理的数据库模式,而是将需求分析得到的用户需求抽象为 反映用户观点的概念模型,即实施概念结构设计 。 概念结构设计是整个数据库设计的关键 。 如前所述,描述概念结构设计的有力工具是实体 -联系 ( E-R) 模型,在此,概念结构设计就归结为
E-R模型,方法的分析与设计 。
E-R方法是面向问题的概念性模型,与数据的存储组织,存取方法,效率等无关,即它不考虑这些数据在 DBMS中态势如何 。
运作 E-R方法的基本步骤如下:
( 1) 划分和确定实体类型与关系类型 。 实体与实体间联系最好为一对多关系 。
( 2) 确定属性 。 找出该实体所融涵的实际属性 。
( 3) 画出 E-R图 。
( 4) 重复步骤 ( 1) 到 ( 3),找出所有实体,关系,属性及属性值集合 。
逻辑结构设计的任务是将概念结构(如 E-R图)转换为与选用数据库管理系统( DBMS)
所支持的数据模型相符的逻辑数据模型,并同时进行数据模型优化。究竟选择哪种数据库管理系统,一般由系统分析员、系统管理员和用户(企业、公司或政府部门的高级管理人员)决定的,需要综合考虑数据库管理系统的性能及所设计的应用系统的功能复杂程度。
在关系型数据库管理系统( RDBMS)中,逻辑结构的设计系指设计数据库中所应包含的各个关系模式的结构,包括关系模式的名称、每一种关系模式各属性的名称、数据类型和取值范围等内容。通常,逻辑结构设计中,概念结构转换过程分成两步进行。首先把概念结构向一般的数据模型转换,然后向特定的数据库管理系统支持下的数据模型转换并进行数据模型优化。
18-1-4 物理 结构设计物理结构设计是为所给定的逻辑结构模型选择最适合应用环境的物理结构,主要是对数据库在物理设备上的存储结构和存取方法的设计。物理结构设计是以逻辑结构设计的结果作为输入,
结合具体数据库管理系统功能及其提供的物理环境与工具、应用环境与数据存储设备,进行数据的存储组织和方法设计,并实施设计与性能预测。
18-1-5 数 据 库实 施数据库实施的主要任务是根据逻辑结构设计与物理结构设计的结果,在系统中建立数据库的结构,载入数据,编制、测试与调试应用程序,对数据库应用系统进行试运行等。
18-1-3 逻辑结构设计数据库实施的具体步骤如下:
( 1)数据库数据的载入和应用程序的编制与调试建立数据库结构;
将原始数据载入数据库;
实施应用程序的编制与调试。
( 2)数据库应用系统的试运行测试系统逻辑功能的完善性;
考察用户需求的吻合程度;
对数据库进行备份。
经过数据库实施阶段的试运行后,系统逻辑功能的完善性与用户需求的吻合程度均已显现并逼近系统要求,且系统已处于一个比较稳定的状态,此时,就可以将系统投入正式运行了。在数据库系统步入运行后,尚需对数据库作经常性的维护,必须不断对其进行评价、调整、修改。该阶段主要涉及如下工作:
( 1)数据库的转储、恢复及数据库的安全性和完整性控制。
( 2)数据库性能的检测、分析、完善,甚至还得对数据库实施更新性操作。
设计一个完整的数据库应用系统,往往是这六大阶段重复运用,不断改进、完善的结果。
18-1-6 数 据 库运 行和 维护随着教育事业的不断发展,学校的规模不断扩大,学生数量及其信息量的急剧增加,有关学生的各种信息管理也随之展开。学生管理信息系统( SMIS,Student Management
Information System)应运而生了,它可用来管理学生信息与提高系统管理工作的效率。
SIMS把 Visual Basic(前台开发)与 SQL Server 2000(后台管理)有机地结合,并运用流行的 ADO等相关技术,完成学生信息的规范管理、科学统计和快速查询,从而可大大减少该管理上的工作量。
数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率以及实现的效果产生影响。合理的数据库结构设计可以提高数据库存储的效率,保证数据的完整性和一致性。同时,合理的数据结构也将有利于程序的顺利实现。
1.需求分析及主要任务系统开发的总体任务是实现学生信息关系的系统化、规范化和自动化。
需求分析是在系统开发总体任务的基础上完成的,设计数据库系统时应该充分了解用户的各方面的需求,包括目前及将来可能拓展的需求态势。因而数据库结构势必要充分满足各种信息的输入和输出。据此,可归结出学生信息管理系统所需完成的主体任务。
SIMS主要任务如下:
( 1) 基本信息的输入。包括学籍(学生基本)信息,班级、课程和成绩等信息的输入。
( 2) 基本信息的修改。 包括 学籍信息,班级、课程和成绩等 信息 的 修改 。
( 3) 基本 信息的查询。包括 学籍信息 和成绩 信息 等的查询。
( 4) 年级信息及 班级信息的设置 等。
( 5) 学校基本课程信息的输入、修改和设置。
( 6) 学籍信息与 课程 信息的统计打印。
( 7) 班级 信息 和成绩 信息 等 的统计打印。
( 8) 软件系统的管理。 包括 学生信息管理系统的初始化、密码设置、用户管理等 。
( 9) 系统帮助。包括 学生信息管理系统的 帮助和系统版本说明等。
18-2 SMIS需求分析 与 功能 结构
2.系统总体功能模块结构基于需求分析及主要任务的表述,可对上述各项功能按照结构化程序设计的要求进行集 中、分层结构化,自上而下逐层设置得到系统功能模块结构图,如图 18-2所示。
图 18-2 系 统 功能模 块结构图添加学籍信息修改学籍信息查询学籍信息打印学籍信息系统初始化用户管理密码管理退出系统打印课程信息设置课程信息添加课程信息修改课程信息添加成绩信息修改成绩信息查询成绩信息打印成绩信息系统帮助成绩管理课程管理学 生信息管理系 统班级管理学籍管理系统管理添加班级信息修改班级信息打印班级信息系统说明关于
3.系统数据流程用户的需求具体体现在各种信息的提供、保存、更新、查询和统计打印上,这就要求数据库结构应充分满足各种信息的输入和输出。系统应定义数据结构、收集基本数据以及设置数据处理的流程,组成一份详尽的数据字典,为而后的具体设计打下基础与伏笔。在仔细分析、
调查有关学生信息管理需要的基础上,得到本系统的数据流程图,如图 18-3所示。
表信息学 生 综 合信息查询处 理信息学 生 综 合信息教务处学 生院系等查询处 理打印数 据处 理系 统 信息学 生信息课 程信息管理 员学 生信息成 绩 信息表 班 级 信息表学 籍信息表 系 统 信息表课 程 设 置表报 表 综合信息图 18-3 系 统数 据 数 据流程 图
18-3 SMIS数 据 结构设计 及 实现
1,数 据 库概 念 结构设计 表信息概 念 结构设计 就是 E-R方法的分析 与设计,概 念 结构设计 是整 个数 据 库设计 的 关键 。在此,将 使用 实 体 -联 系( E-R)模型 来 描述系 统 的 概 念 结构,同 时设计 出能 够满 足用 户 需求的各 种实 体,以及 它们 之 间 的 关 系,为 后面的 逻辑结构设计 打下基 础 。 这 些 实 体包含各 种 具体 实际 信息,通 过 相互之 间 的作用形成 数 据的流 动 。
本程序根据上面的 设计规划 出的 实 体有,学 籍 实 体、班 级实 体、年 级实 体,课 程 实 体 与 成 绩实 体,
它们 的 E-R图 如 图 18-4所示。
学号课程编号课程名称课程描述课程类型年级设置属于班级课程设置上课课程联系电话姓名 班级编号性别 备注出生日期 入校时间 家庭地址学号学籍年级信息属 于成绩 考试班号年级班主任姓名教室 考试编号分数年级 课程名称课程学分图 18-4 学 生管理信息系 统 ER图
2.数据库逻辑结构设计针对一般学生信息管理系统的总体需求,通过对学生信息管理过程的内容和数据流程分析与系统总体功能模块梳理,可归结出系统数据库的逻辑结构,设计、
产生如下所示的 数据项和数据结构,
( 1)学生基本信息(学籍信息)数据项为:学号、姓名、性别、出生日期、班号、联系电话、入校时间、家庭地址、备注等。
( 2)班级基本数据项为:班号、年级、班主任姓名、教室等。
( 3)课程基本数据项为:课程号、课程名称、课程类型、课程描述等。
( 4) 课程基本设置数据项为:包括的数据项有,年级,课程学分,所学课程等 。
( 5) 成绩基本数据项为:学号,考试编号,班级,课程名称,考试分数等 。
3.数据库物理结构设计基于上述的数据库概念结构与数据库逻辑结构设计的结果,现可以实施将其转化为 SQL
Server 2000数据库系统所支持的实际数据模型:数据表对象(即为它们 选择最适合应用环境,对数据库在物理设备上的存储结构和存取方法予以设计 ),并形成数据库中各个表格之间的关系。学生信息管理系统数据库中各个表格的设计结果如表 18-1至表 18-6所示。
4.数据库的实现经过前面对需求分析和概念结构设计以后,得到数据库的逻辑结构。现在就可以在 SQL
Server 2000数据库的系统中实现该逻辑结构。利用 SQL Server 2000 数据库系统中的
SQL查询分析器实现,
列(字段)名 数 据 类 型 与长 度 空 否 说 明
student_ID Char(4) Not null 学号 ( 学 生 学号,主 键 )
student_Name Char(10) Not null 姓名 ( 学 生姓名 )
student_Gender Char(2) Not null 性 别 ( 学 生性 别 )
born_Date Datetime(8) Not null 出生日期
class_No Char(4) Not null 班 号 ( 班 级编号,外 键 )
tele_Number Char(16) Null 联 系 电话
ru_Date Datetime(8) Null 入校 时间
Address Varchar(50) Null 家庭地址
Comment Varchar(200) Null 备 注表 18-1 Student_Info 学 籍信息表列 ( 字段 ) 名 数据类型与长度 空 否 说 明
Exam_No Char(10) Not null 考试编号 ( 主键 )
Student_Id Char(4) Not null 学生学号 ( 学号:外键 )
Student_Name Char(10) Not null 学生姓名 ( 姓名 ),可略
Class_No Char(10) Not null 班号 ( 班级编号:外键 )
Course_Name Char(10) Null 课程名称
Mark Float(8) Null 分数列 ( 字段 ) 名 数据类型与长度 空 否 说 明
class_No Char(10) Not null 班号 ( 班级编号:主键 )
Grade Char(10) Not null 年级 ( 外键 )
Director Char(10) Null 班主任姓名
Classroom_No Char(10) Null 教室 ( 所在教室 )
表 18-2 result_Info 学生成绩信息表表 18-3 Class_Info 班级信息表列(字段)名 数 据 类 型 与长 度 空 否 说 明
Grade Char(10) Not null 年 级 ( 主 键 )
course_Name Char(10) Not null 课 程名 称
course_Mark Float(8) Not null 课 程分 数列 ( 字段 ) 名 数 据 类 型 与长 度 空 否 说 明
Course_No Char(10) Not null 课 程 编号 ( 主 键 )
Course_Name Char(20) Null 课 程名 称
Course_Type Char(10) Null 课 程 类 型
Course_Des Text Null 课 程描述列 ( 字段 ) 名 数 据 类 型 与长 度 空 否 说 明
user_ID Char(10) Not null 用 户 名 称 ( 主 键 )
user_PWD Char(10) Not null 用 户 密 码
user_DES Char(10) Null 用 户 描述表 18-4 gradecourse_Info 年 级课 程 设 置表表 18-5 course_Info 课 程基本信息 表表 18-6 User_Info 系 统 用 户 表
4.数据库的实现具体语句如下 。
( 1)创建学生数据库
CREATE DATABASE xsgl
ON PRIMARY
(NAME=xsgl_dat,FILENAME='D:\xsgl\xsgl.mdf',
SIZE=10,MAXSIZE =20,FILEGROWTH = 5%),
FILEGROUP data1
(NAME=xsglgroup_dat,FILENAME='D:\xsgl\xsglgroup.ndf',
SIZE=2,MAXSIZE=100,FILEGROWTH=1),
LOG ON
(NAME='xsgl_log1',FILENAME='D:\xsgl\ xsgl_log1.ldf',
SIZE = 10MB,MAXSIZE=25MB,FILEGROWTH=5% )
Go
( 2) 创建学籍 ( 学生基本信息 ) 表
CREATE TABLE student_Info (
student_ID char (4) primary key,
student_Name char (10),
student_Sex char (2),
born_Date datetime,
class_NO char (4),
tele_Number char (10) NULL,
ru_Date datetime NULL,
address varchar (50) NULL,
comment Text)
go
( 3)创建学生成绩信息表
CREATE TABLE result_Info (
exam_No char (10) primary key,
student_ID char (4) NOT NULL,
student_Name char (10) NOT NULL,
class_No Char(10) NOT NULL,
course_Name char (10) NULL,
result float NULL)
go
( 4)创建班级信息表
CREATE TABLE class_Info (
class_No char (10) primary key,
grade char (10),
director char (10) NULL,
classroom_No char (10) NULL)
go
( 5)创建年级课程信息表
CREATE TABLE [dbo].[gradecourse_Info] (
Grade char (10) primary key,
course_Name char (10) NULL
result float NULL)
go
( 6)创建课程基本信息表
CREATE TABLE course_Info (
course_No char (4) primary key,
course_Name char (10) NULL,
course_Type char (10) NULL,
course_Des char] (50) NULL)
go
( 7)创建系统用户表
CREATE TABLE user_Info (
user_ID char(10) NOT NULL,
user_PWD char (10) NOT NULL,
user_Des char] (10) NULL)
go
上述 SQL语句在 SQL Server 2000的查询分析中执行后,可便捷而自动地产生所需的数据表。现在将基于 Visual Basic前台开发与 SQL Server 2000后台管理的有机结合来实施系统设置和应用程序编制,即通过 VB来编写数据库系统的客户端程序,且 系统采用 ADO对象访问技术来访问数据库。
1.创建主控窗体
Visual Basic开发的应用程序界面有,SDI(单文档界面),MDI(多文档界面)和资源管理器界面三种,在 MDI程序由一个主窗体和若干个 MDI子窗体构成。本应用系统实例主要基于多文档界面,如此可以更加美观、界面友好、整齐有序。图 18-5即为融含菜单的学生管理信息系统主控窗体。在主窗体的 load()事件里,设置了系统的登录日期与登录时间。
18-4 SMIS应 用程序的 编 制
Private Sub MDIForm_Load()
FrmMain.StatusBarMy.Panels.Item(2).Text = "登录日期," & Date
FrmMain.StatusBarMy.Panels.Item(3).Text = "登录时间," & Time
End Sub
图 18-5 SMIS系 统 的主窗体 对话 框
2.创建公用模块
( 1)创建 Module1公用模块在 VB中可用公用模块来存放整个工程项目中的公用函数、全局变量等。整个工程项目中的任何地方都可以调用公用模块中的函数、变量,这样可以极大地提高代码的效率。在此,系统在项目资源管理器中设置了一个 Module1公用模块,保存为 Module1.bas,以资系统共享。代码如下:
Public Function ExecuteSQL(ByVal SQL As String,MsgString As String) As ADODB.Recordset
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sTokens() As String
On Error GoTo ExecuteSQL_Error
sTokens = Split(SQL)
Set cnn = New ADODB.Connection
cnn.Open ConnectString
If InStr("Insert,Delete,Update",UCase$(sTokens(0))) Then
cnn.Execute SQL
MsgString = sTokens(0) & "query successful"
Else
Set rst = New ADODB.Recordset
rst.Open (SQL),cnn,adOpenKeyset,adLockOptimistic
Set ExecuteSQL = rst
MsgString = "查询到 " & rst.RecordCount & "条记录 "
End If
ExecuteSQL_Exit:
Set rst = Nothing
Set cnn = Nothing
Exit Function
ExecuteSQL_Error:
MsgString = "查询错误," & Err.Description
Resume ExecuteSQL_Exit
End Function
Public Function ConnectString() As String
ConnectString = "provider=sqloledb;uid=sa;pwd=sayu;database=xsgl"
End Function
Sub Main()
Dim fLogin As New FrmLogin
fLogin.Show vbModal
If Not fLogin.OK Then
End
End If
Unload fLogin
Set fMainForm = New FrmMain
fMainForm.Show
End Sub
ExecuteSQL函数附有两个参数,SQL和 MsgString,前者用来存放需要执行的 SQL语句,
后者( MsgString)用来返回执行的提示信息。函数运行时,首先判断 SQL语句所含的内容:
当执行查询操作时,ExecuteSQL函数将返回一个与函数同名的包含满足条件记录的记录集对象( Recordset);否则执行添加、删除、更新等操作时,不返回记录集对象。
ExecuteSQL函数中调用了 ConnectString()子函数用以连接 xsgl数据库。
由于在后面的程序中,需要频繁检查、判断文本框的内容是否为空,在此尚定义了一个
Testtxt函数,以资调用。代码如下:
Public Function Testtxt(txt As String) As Boolean
If Trim(txt) = "" Then
Testtxt = False
Else
Testtxt = True
End If
End Function
若文本框的内容为空函数将返回 True,否则为 False。
( 2)创建身份认证窗体软件中设置了用户登录应用系统时的身份认证机制,通过用户名与密码核对来防止非法者使用学生管理信息系统,如图 18-6所示。
Dim txtSQL As String,mrc As ADODB.Recordset,MsgText As String
UserName = ""
If Trim(txtUserName.Text = "") Then
MsgBox "用户名不为空,请重新输入! ",vbOKOnly + vbExclamation,"警告 "
txtUserName.SelStart=0:txtUserName.SelLength = Len(txtUserName.Text)
txtUserName.SetFocus:Exit Sub
Else
txtSQL = "Select * from user_info where user_ID='" & Trim(txtUserName.Text) &
"'"
Set mrc = ExecuteSQL(txtSQL,MsgText)
If mrc.EOF = True Then
MsgBox "用户名出错,请重新输入! ",vbOKOnly + vbExclamation,"警告 "
txtUserName.SelStart=0:txtUserName.SelLength = Len(txtUserName.Text)
txtUserName.SetFocus:Exit Sub
Else
If Trim(mrc.Fields(1)) = Trim(txtPassword.Text) Then
OK = True:mrc.Close:UserName = Trim(txtUserName.Text)
FrmMain.Show:Unload Me
Else
MsgBox "密码出错,请重新输入! ",vbOKOnly + vbExclamation,"警告 "
txtPassword.Text="":txtPassword.SetFocus:Exit Sub
End If
End If
End If
miCount = miCount + 1
If miCount = 3 Then
MsgBox "尝试数超过 3次,您无权使用本程序 ",vbExclamation,"警告 "
End
End If
End Sub
该模块允许用户登录差错三次,否则自动锁断系统,拒绝再度登录。
3.创建学籍信息输入窗体启动学籍信息输入窗体是使用主窗体的菜单项完成的,具体过程语句如下:
Private Sub mnuAddInfo_Click()
Frmsinfo.Move 0,0
Frmsinfo.Height = 4810
Frmsinfo.Width = 6830
Frmsinfo.Show ‘ 激活、启动学籍信息输入窗体
End Sub
选择“学籍管理”菜单的“添加学籍信息”项,出现 如图 18-7所示的 窗体界面。窗体加载时通过
load()事件对窗体进行初始化,其代码如下:
Private Sub Form_Load()
Dim mrc As ADODB.Recordset:Dim txtSQL As String
Dim MsgText As String:Dim i As Integer
cboGender.AddItem ""
cboGender.AddItem "男 "
cboGender.AddItem "女 "
txtSQL = "Select * from class_Info"
Set mrc = ExecuteSQL(txtSQL,MsgText)
mrc.MoveFirst
cboClassNumber.AddItem ""
For i = 1 To mrc.RecordCount
cboClassNumber.AddItem mrc.Fields(0)
mrc.MoveNext
Next
mrc.Close
End Sub
1) 学籍信息输入窗体中的,确认添加,按钮,首先把用户输入的信息进行有效性检验,然后才把信息添加到数据库的表中 。
( 1) 输入过程的有效性检验 。
Private Sub cmdOK_Click() '添加新记录
Dim mrc As ADODB.Recordset
Dim txtSQL As String
Dim MsgText As String
If Not Testtxt(txtId.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入学号! "
txtId.SetFocus:Exit Sub
End If
If Not Testtxt(txtName.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入姓名! "
txtName.SetFocus:Exit Sub
End If
If Not Testtxt(cboGender.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请选择性别! "
cboGender.SetFocus:Exit Sub
End If
If Not Testtxt(txtBirthday.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入出生日期! "
txtBirthday.SetFocus:Exit Sub
End If
If Not Testtxt(cboClassNumber.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请选择班级! "
cboClassNumber.SetFocus:Exit Sub
End If
If Not Testtxt(txtPhone.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入联系电话! "
txtPhone.SetFocus:Exit Sub
End If
If Not Testtxt(txtDate.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入入校日期! "
txtDate.SetFocus:Exit Sub
End If
If Not Testtxt(txtAddress.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入家庭地址! "
txtAddress.SetFocus:Exit Sub
End If
If Not IsNumeric(Trim(txtPhone.Text)) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "联系电话应该是数字型! "
txtPhone.SelStart=0:txtPhone.SelLength = Len(txtPhone.Text)
txtPhone.SetFocus,Exit Sub
End If
If Not IsNumeric(Trim(txtId.Text)) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "学号应该是数字型! "
txtId.SelStart = 0:txtId.SelLength = Len(txtId.Text)
txtId.SetFocus,Exit Sub
End If
If Not IsDate(Trim(txtBirthday.Text)) Then
MsgBox "出生日期输入有误! "&Chr(13)&"举例:( 2003-08-08) ",_
vbOKOnly + vbExclamation,"提示 "
txtBirthday.SelStart=0:txtBirthday.SelLength = Len(txtBirthday.Text)
txtBirthday.SetFocus:Exit Sub
Else
txtBirthday = Format(txtBirthday,"yyyy-mm-dd")
End If
If Not IsDate(Trim(txtDate.Text)) Then
MsgBox "入校日期输入有误! " & Chr(13) & "举例:( 2003-1-1) ",_
vbOKOnly + vbExclamation,"提示 "
txtDate.SelStart = 0:txtDate.SelLength = Len(txtDate.Text)
txtDate.SetFocus:Exit Sub
Else
txtDate = Format(txtDate,"yyyy-mm-dd")
End If
( 2)向数据表中写入数据信息。
txtSQL ="Select * from student_Info where student_ID='" & Trim(txtId.Text)
& _
"'"&" and class_No='"&Trim(cboClassNumber.Text) & "'"
Set mrc = ExecuteSQL(txtSQL,MsgText)
If mrc.EOF = False Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "该班级中已经存在此学号,请重新输入! "
mrc.Close:txtId.SelStart = 0
txtId.SelLength = Len(txtId.Text)
txtId.SetFocus:Exit Sub
Else
mrc.AddNew:mrc.Fields(0) = Trim(txtId.Text)
mrc.Fields(1) = Trim(txtName.Text)
mrc.Fields(2) = Trim(cboGender.Text)
mrc.Fields(3) = Trim(txtBirthday.Text)
mrc.Fields(4)=Trim(cboClassNumber.Text)
mrc.Fields(5) = Trim(txtPhone.Text):mrc.Fields(6) = Trim(txtDate.Text)
mrc.Fields(7) = Trim(txtAddress.Text):mrc.Fields(8) = Trim(txtComment.Text)
mrc.Update
FrmMain.StatusBarMy.Panels.Item(1).Text = "添加学籍信息成功! "
mrc.Close
End If
End Sub
2)学籍信息输入窗体中的“取消添加”按钮,用来取消本次添加操作。
Private Sub cmdCancel_Click() '取消本次并退出本窗体
FrmMain.StatusBarMy.Panels.Item(1).Text = ""
Unload Me
End Sub
3)学籍信息输入窗体中的“清空”按钮,用来取消在窗体中输入的学籍信息。
Private Sub cmdClear_Click() ' 清空各添加框信息
txtId.Text = ""
txtName.Text = ""
cboGender.ListIndex = 0
txtBirthday.Text = ""
cboClassNumber.ListIndex = 0
txtPhone.Text = ""
txtDate.Text = ""
txtAddress.Text = ""
txtComment.Text = ""
FrmMain.StatusBarMy.Panels.Item(1).Text = ""
End Sub
4.修改学籍信息窗体选择“学籍管理”菜单的“添加学籍信息”项,出现如图 18-7与图 18-8所示的窗体界面。
在该窗体中,即可以一般的浏览查询(可进行记录指针的相对移动:上移一条记录、
下移一条记录、记录指针指向首记录和针指向末记录),也可以进入修改分支,实施数据修改、改好以后更新存盘、退出修改和删除记录。具体代码分解如下:
图 18-7 学 籍信息修改 -浏览状态对话 框图 18-8 学 籍信息修改 -修改 状态对话 框
( 1)窗体的载入事件,Form_Load()。
Private Sub Form_Load()
Dim txtSQL As String,Dim MsgText As String
txtSQL = "Select * from student_Info",Set mrc = ExecuteSQL(txtSQL,MsgText)
mrc.MoveFirst ' 显示第一条记录
If mrc.EOF Then
MsgBox "表信息已空!! "
End If
Call viewData,mcclean = True
txtId.Enabled = False ' 设置窗体信息不可修改
txtName.Enabled = False
cboGender.Enabled = False
txtBirthday.Enabled = False
cboClassNumber.Enabled = False
txtPhone.Enabled = False
txtDate.Enabled = False
txtAddress.Enabled = False
txtComment.Enabled = False
End Sub
( 2)窗体信息的浏览查询。
Private Sub cmdFirst_Click() ' 显示第一条记录
mrc.MoveFirst,Call viewData
End Sub
Private Sub cmdPrevious_Click() '显示当前记录的上一条记录
mrc.MovePrevious
If mrc.BOF Then
mrc.MoveLast
End If
Call viewData
End Sub
Private Sub cmdNext_Click() '显示当前记录的下一条记录
mrc.MoveNext
If mrc.EOF Then
mrc.MoveFirst
End If
Call viewData
End Sub
Private Sub cmdLast_Click() '显示最后一条记录
mrc.MoveLast,Call viewData
End Sub
( 3)修改窗体的学籍信息。
Private Sub cmdEdit_Click() '进入修改状态,且移动按钮不可用!
mcclean = False,cmdFirst.Enabled = False,cmdPrevious.Enabled = False
cmdNext.Enabled = False,cmdLast.Enabled = False
txtId.Enabled = True ' 设置学籍信息可修改,Enabled属性有效
txtName.Enabled = True
cboGender.Enabled = True,txtBirthday.Enabled = True
cboClassNumber.Enabled = True,txtPhone.Enabled = True
txtDate.Enabled = True,txtAddress.Enabled = True
txtComment.Enabled = True,sFlag = txtId.Text
FrmMain.StatusBarMy.Panels.Item(1).Text = "当前是修改状态 "
End Sub
( 4)更新窗体的学籍信息。
Private Sub cmdUpdate_Click() ' 把修改后的内容加到数据库中
Dim txtSQL As String,Dim MsgText As String
Dim mrc As ADODB.Recordset
If mcclean Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请先点击修改记录按钮,进入修改状态 "
Exit Sub
End If
If Not Testtxt(txtId.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入学号! "
txtId.SetFocus,Exit Sub
End If
If Not Testtxt(txtName.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入姓名! "
txtName.SetFocus,Exit Sub
End If
If Not Testtxt(cboGender.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请选择性别! "
cboGender.SetFocus,Exit Sub
End If
If Not Testtxt(txtBirthday.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入出生日期! "
txtBirthday.SetFocus,Exit Sub
End If
If Not Testtxt(cboClassNumber.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请选择班级! "
cboClassNumber.SetFocus,Exit Sub
End If
If Not Testtxt(txtPhone.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入联系电话! "
txtPhone.SetFocus,Exit Sub
End If
If Not Testtxt(txtDate.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入入校日期! "
txtDate.SetFocus,Exit Sub
End If
If Not Testtxt(txtAddress.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入家庭地址! "
txtAddress.SetFocus,Exit Sub
End If
If Not IsNumeric(txtPhone.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "联系电话应该是数字型! "
txtPhone.SelStart = 0,txtPhone.SelLength = Len(txtPhone.Text)
txtPhone.SetFocus
Exit Sub
End If
If Not IsNumeric(Trim(txtId.Text)) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "学号应该是数字型! "
txtId.SelStart = 0,txtId.SelLength = Len(txtId.Text),txtId.SetFocus
Exit Sub
End If
If Not IsDate(Trim(txtBirthday.Text)) Then
vbOKOnly + vbExclamation,"提示 "
FrmMain.StatusBarMy.Panels.Item(1).Text = "出生日期输入有误! " _
& Chr(13) & "举例:( 1983-1-1) "
txtBirthday.SelStart = 0,txtBirthday.SelLength = Len(txtBirthday.Text)
txtBirthday.SetFocus,Exit Sub
Else
txtBirthday = Format(txtBirthday,"yyyy-mm-dd")
End If
If Not IsDate(txtDate.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "入校日期输入有误! " _
& Chr(13) & "举例:( 2003-1-1) "
txtDate.SelStart = 0,txtDate.SelLength = Len(txtDate.Text)
txtDate.SetFocus,Exit Sub
Else
txtDate = Format(txtDate,"yyyy-mm-dd")
End If
txtSQL = "Select * from student_Info where student_ID='" & Trim(txtId.Text) & _
"'" & " and class_No='" & Trim(cboClassNumber.Text) & "'"
Set mrc = ExecuteSQL(txtSQL,MsgText)
If mrc.EOF = False And Trim(txtId.Text) <> sFlag Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "该班级已存在此学号,请重新输入学号! "
txtId.SelStart = 0,txtId.SelLength = Len(txtId.Text)
txtId.SetFocus,Exit Sub
Else
txtSQL = "Select * from student_Info where student_ID='" & Trim(sFlag) & "'"
Set mrc = ExecuteSQL(txtSQL,MsgText) '更新数据
mrc.Fields(0) = Trim(txtId.Text),mrc.Fields(1) = Trim(txtName.Text)
mrc.Fields(2) = Trim(cboGender.Text),mrc.Fields(3) = Trim(txtBirthday.Text)
mrc.Fields(4) = Trim(cboClassNumber.Text),mrc.Fields(5) = Trim(txtPhone.Text)
mrc.Fields(6) = Trim(txtDate.Text),mrc.Fields(7) = Trim(txtAddress.Text)
mrc.Fields(8) = Trim(txtComment.Text),mrc.Update
FrmMain.StatusBarMy.Panels.Item(1).Text = "修改学籍信息成功! "
cmdFirst.Enabled = True,cmdPrevious.Enabled = True
cmdNext.Enabled = True,cmdLast.Enabled = True
txtId.Enabled = False,txtName.Enabled = False
cboGender.Enabled = False,txtBirthday.Enabled = False
cboClassNumber.Enabled = False,txtPhone.Enabled = False
txtDate.Enabled = False,txtAddress.Enabled = False
txtComment.Enabled = False,mcclean = True
End If
End Sub
( 5)退出修改状态。
Private Sub cmdCancel_Click() ' 退出修改状态
If Not mcclean Then
cmdFirst.Enabled = True,cmdPrevious.Enabled = True
cmdNext.Enabled = True,cmdLast.Enabled = True
txtId.Enabled = False,txtName.Enabled = False
cboGender.Enabled = False,txtBirthday.Enabled = False
cboClassNumber.Enabled = False,txtPhone.Enabled = False
txtDate.Enabled = False,txtAddress.Enabled = False
txtComment.Enabled = False,mcclean = True
End If
Call viewData,FrmMain.StatusBarMy.Panels.Item(1).Text = ""
End Sub
( 6)删除当前记录。
Private Sub cmdDelete_Click() ' 删除当前记录
sFlag = MsgBox("是否删除当前记录? ",vbOKCancel,"删除记录 ")
If sFlag = vbOK Then
mrc.MoveNext
If mrc.EOF Then
mrc.MovePrevious,mrc.Delete
Else
mrc.MovePrevious,mrc.Delete
FrmMain.StatusBarMy.Panels.Item(1).Text = "成功删除 !"
End If
Else
Exit Sub
End If
End Sub
5.查询学籍信息窗体选择“学籍管理”菜单的“查询学籍信息”项,出现如图 18-9和图 18-10所示的窗体界面。
在该窗体中,可以进行三种最常用的条件性查询:按学号条件查询、按姓名条件查询和按班级条件查询。该窗体上部是以表格的方式显示符合条件的学籍信息,下部“查询记录”
中有三个复选框(按学号、按姓名、按班级),通过选择复选框及“查询”按钮即可显示相关信息。图中也可以使用“清空”按钮将窗体上部表格中的学籍信息清除。
图 18-11 添加用 户对话 框具体程序代码入下:
Private Sub cmdInquire_Click() ' 按条件查询
Dim txtSQL As String,Dim MsgText As String
Dim dd(4) As Boolean '记录复选框的选择情况
Dim mrc As ADODB.Recordset
msgFlexgrid.Clear
txtSQL = " Select * from student_Info where "
If chkId.Value = 1 Then ' 选中按学号查询
If Trim(txtId.Text = "") Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "如果要按学号查询,请输入学号 "
txtId.SetFocus,Exit Sub
Else
If Not IsNumeric(Trim(txtId.Text)) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "学号必须为数字型 !"
txtId.SetFocus,Exit Sub
End If
dd(0) = True ' 设置按学号查询逻辑值
txtSQL = txtSQL & "student_Id='" & Trim(txtId.Text) & "'"
End If
End If
If chkName.Value = 1 Then ' 选中按姓名查询
If Trim(txtName.Text = "") Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "如果要按姓名查询,请输入姓名 "
txtName.SetFocus,Exit Sub
Else
dd(1) = True ' 设置按姓名查询逻辑值
If dd(0) = True Then
txtSQL = txtSQL & "and student_Name='" & Trim(txtName.Text) & "'"
Else
txtSQL = txtSQL & "student_Name='" & Trim(txtName.Text) & "'"
End If
End If
End If
If chkClassId.Value = 1 Then ' 选中按班级查询
If Trim(txtClassId.Text) = "" Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "如果要按班级查询,请输入班级 "
txtClassId.SetFocus,Exit Sub
Else
dd(2) = True ' 设置按班级查询逻辑值
If Not IsNumeric(Trim(txtClassId.Text)) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "班级必须为数字型 !"
txtId.SetFocus,Exit Sub
End If
If dd(0) = True And dd(1) = True Then
txtSQL = txtSQL & "and class_No='" & Trim(txtClassId.Text) & "'"
Else
txtSQL = txtSQL & "class_No='" & Trim(txtClassId.Text) & "'"
End If
End If
End If
If Not (dd(0) Or dd(1) Or dd(2) Or dd(3)) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "您还没输入查询方式呢 !"
txtId.SetFocus,Exit Sub
End If
txtSQL = txtSQL & "order by student_id",Set mrc = ExecuteSQL(txtSQL,MsgText)
With msgFlexgrid ' 显示表格头
.Row = 1
.CellAlignment = 4
.TextMatrix(0,0) = "学号 "
.TextMatrix(0,1) = "姓名 "
.TextMatrix(0,2) = "性别 "
.TextMatrix(0,3) = "出生日期 "
.TextMatrix(0,4) = "班号 "
.TextMatrix(0,5) = "联系电话 "
.TextMatrix(0,6) = "入校时间 "
.TextMatrix(0,7) = "家庭住址 "
Do While Not mrc.EOF ' 循环显示学籍信息
.Row =,Row + 1
.CellAlignment = 4
.TextMatrix(.Row - 1,0) = mrc.Fields(0)
.TextMatrix(.Row - 1,1) = mrc.Fields(1)
.TextMatrix(.Row - 1,2) = mrc.Fields(2)
.TextMatrix(.Row - 1,3) = Format(mrc.Fields(3),"yyyy-mm-dd")
.TextMatrix(.Row - 1,4) = mrc.Fields(4)
.TextMatrix(.Row - 1,5) = mrc.Fields(5)
,TextMatrix(.Row - 1,6) = Format(mrc.Fields(6),"yyyy-mm-dd")
.TextMatrix(.Row - 1,7) = mrc.Fields(7)
mrc.MoveNext
Loop
End With
mrc.Close
End Sub
6.系统设置类窗体学生管理信息系统还提供了若干系统 选择设置类窗体,如添加用户、设置密码、设置年级课程和系统初试化等程序模块。可用来添加系统的用户(包括输入用户名、登录密码等);
使用若干时间后,可酌情修改密码(选择易于记忆或有意义的密码);随着变化可以设置各年级富有新意或应用特征及时代意义的不同年级的相关课程;系统也可按需设置初始化性质的数据,各种专业的额定学分、基础课的增设与课时调整(如增设 3个代表基础课、调整哲学课的学时数等)、专业课课时的调整(如强化面向应用型课程教学的课时数)等。
1)添加用户添加用户的窗体如图 18-11所示,代码如下。
Private Sub cmdOK_Click() ' 添加新用户
Dim txtSQL As String,mrc As ADODB.Recordset,MsgText As String
If Trim(txtUserName.Text) = "" Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入用户名 "
txtUserName.SetFocus,Exit Sub
Else
txtSQL = "Select * from user_info",Set mrc = ExecuteSQL(txtSQL,MsgText)
While (mrc.EOF = False)
If Trim(mrc.Fields(0)) = Trim(txtUserName.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "该用户已存在,请重输! "
txtUserName.SetFocus
txtUserName.Text = "",txtPassword1.Text = "",txtPassword2.Text = ""
Exit Sub
Else
mrc.MoveNext
End If
Wend
End If
If Trim(txtPassword1.Text) = "" Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "为了安全,密码不为空! "
txtPassword1.SetFocus,txtPassword1.Text = "",txtPassword2.Text = ""
Else
If Trim(txtUserName.Text) <> Trim(txtPassword2.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "密码输入不一致 !"
txtPassword1.SetFocus,txtPassword1.Text = "",txtPassword2.Text = ""
Exit Sub
Else
mrc.AddNew ' 添加新记录并写入表内
mrc.Fields(0) = Trim(txtUserName.Text)
mrc.Fields(1) = Trim(txtPassword1.Text)
mrc.Update
mrc.Close
Me.Hide
FrmMain.StatusBarMy.Panels.Item(1).Text = "添加用户成功 !"
End If
End If
End Sub
2)设置年级课程设置年级课程的窗体如图 18-12所示,其中可以由组合框选择年级,点击“课程设置”按钮,在左侧的“所有课程”列表框中会显示已开设的所有课程,通过点击 按钮可添加到“已选择的课程” 列表框中,反之,也可移出该列表框。最后,通过点击“确认添加”按钮完成年级课程的设置。设置年级课程程序代码如下。
图 18-12 设 置年 级课 程 对话 框
( 1) 设置年级课程窗体的载入事件,Form_Load ()用于产生可供选择的年级项 。
Private Sub Form_Load()
cboGrade.AddItem " "
cboGrade.AddItem "大一 "
cboGrade.AddItem "大二 "
cboGrade.AddItem "大三 "
cboGrade.AddItem "大四 "
End Sub
( 2)选择课程到,已选择的课程” 列表中。
Private Sub cmdAdd_Click()
把 lstAllCourse(所有课程列表)的选中项添加到 lstSelectCourse(已选择的课程)中去
Dim i As Integer
If lstAllCourse.ListIndex <> -1 Then
sFlag = 0
For i = 1 To lstSelectCourse.ListCount
If Trim(lstAllCourse.List(lstAllCourse.ListIndex)) = Trim(lstSelectCourse.List(i))
Then
sFlag = 1 ' 判断选中项是否存在于 lstSelectCourse中
End If
Next
If sFlag = 0 Then
lstSelectCourse.AddItem lstAllCourse.List(lstAllCourse.ListIndex)
End If
End If
End Sub
( 3)从,已选择的课程” 列表中移出所选课程。
Private Sub cmdDelete_Click() ' 移出 lstAllCourse()的选中项
If lstSelectCourse.ListIndex <> -1 Then
lstSelectCourse.RemoveItem lstSelectCourse.ListIndex
End If
End Sub
( 4)从表中取出并 显示已开设的课程。
Private Sub cmdSet_Click() ' 功能是进入课程设置,显示已开设的课程
Dim mrc As ADODB.Recordset,Dim txtSQL As String,Dim MsgText As String
Dim i As Integer
lstAllCourse.Enabled = True,lstSelectCourse.Enabled = True
cmdModify.Enabled = True,cmdAdd.Enabled = True
cmdDelete.Enabled = True
lstAllCourse.Clear ' 清空所有课程列表 lstAllCourse
lstSelectCourse.Clear ' 清空已选择课程列表 lstSelectCourse
txtSQL = "Select * from course_Info" ' 从 course_Info课程表中取出所有已开设的课程
Set mrc = ExecuteSQL(txtSQL,MsgText)
While (mrc.EOF = False)
lstAllCourse.AddItem mrc.Fields(1)
mrc.MoveNext
Wend
txtSQL = "Select * from gradecourse_Info" ' 从 gradecourse_Info表中年级与课程
Set mrc = ExecuteSQL(txtSQL,MsgText)
mrc.MoveFirst
While Not mrc.EOF
If cboGrade.Text = Trim(mrc.Fields(0)) Then
lstSelectCourse.AddItem mrc.Fields(1)
End If
mrc.MoveNext
Wend
mrc.Close
End Sub
( 5)点击,确认添加,按钮,确认所设置的 课程。
Private Sub cmdModify_Click() ' 功能是把最终结果加到数据库中
Dim i As Integer,Dim mrc As ADODB.Recordset
Dim txtSQL As String,Dim MsgText As String
txtSQL = "select * from gradecourse_Info where grade='" & Trim(cboGrade.Text) & "'"
Set mrc = ExecuteSQL(txtSQL,MsgText)
If mrc.EOF Then
For i = 1 To lstSelectCourse.ListCount
mrc.AddNew,mrc.Fields(0) = Trim(cboGrade.Text)
mrc.Fields(1) = Trim(lstSelectCourse.List(i - 1)),mrc.Update
Next
mrc.Close
FrmMain.StatusBarMy.Panels.Item(1).Text = "课程设置成功 !"
Else
txtSQL = "delete from gradecourse_Info where grade='" & _
Trim(cboGrade.Text) & "'"
Set mrc = ExecuteSQL(txtSQL,MsgText)
txtSQL = "select * from gradecourse_Info"
Set mrc = ExecuteSQL(txtSQL,MsgText)
For i = 1 To lstSelectCourse.ListCount
mrc.AddNew
mrc.Fields(0) = Trim(cboGrade.Text)
mrc.Fields(1) = Trim(lstSelectCourse.List(i - 1))
mrc.Update
Next
mrc.Close
FrmMain.StatusBarMy.Panels.Item(1).Text = "课程设置成功 !"
End If
End Sub
7.其他类窗体除上述窗体外,尚有:添加班级信息(如图 18-13)、修改班级信息(如图 18-14)、添加课程信息(如图 18-15)、添加成绩信息(如图 18-16)、修改课程信息(如图 18-17)、
修改成绩信息(如图 18-18)、打印成绩信息、查询成绩信息(如图 18-19)、系统使用说明和关于系统的版本说明(如图 18-20)等模块。由于它们的语句代码编制技巧和前面所述雷同,鉴于篇幅原因就不作详细介绍了。各个窗体中的,退出,按钮代码一样,都在按钮的
click事件下添加,Unload Me” 代码。
图 18-13 添加班 级 信息 对话 框 图 18-14 修改班 级 信息 对话 框图 18-15 添加 课 程信息 对话 框图 18-17 修改 课 程信息 对话 框图 18-19 查询 成 绩 信息 对话 框 图 18-20 关 于 SMIS版本 说 明 对话 框图 18-18 修改成 绩 信息 对话 框图 18-16 添加成 绩 信息 对话 框学生管理信息系统中还使用 SQL Server 2000 创建了若干数据库对象,如数据库关系图、
视图、查询、存储过程、触发器、规则等,以便于系统管理与程序开发。在此,鉴于篇幅仅介绍其中部分常用的内容。
1.创建关系图关系图是以图形方式显示通过数据连接选择的表或表结构化对象,并显示它们之间的联接关系。在本系统中也对相关表建立了彼此间的关系图,如图 18-21所示。
系 统 中各表 间 的 关 系图图 18-21 SMIS中 数 据表 间关 系 图对话 框
18-5 SQL Server 数 据 库对 象 设计
2.创建视图使用视图可对数据库中相关表实施 Select-From-Where语句查询,图 18-22所示的是视图设计器创建视图的过程(包含了关系图、设计表格,SQL语句和执行结果),该视图为建立了学籍信息表、成绩信息表和课程信息表间的关联性关系的视图 xsglo,它包括了关系数据库的选择、投影和连接三大运算。创建该视图的具体语句如下:
CREATE VIEW xsglo
AS
SELECT TOP 100 PERCENT dbo.student_Info.student_ID,
dbo.student_Info.student_Name,
dbo.student_Info.class_No,dbo.student_Info.tele_Number,dbo.student_Info.ru_Date,
dbo.student_Info.address,dbo.result_Info.exam_No,dbo.result_Info.course_Name
FROM dbo.course_Info INNER JOIN
dbo.student_Info INNER JOIN
dbo.result_Info ON dbo.student_Info.student_ID = dbo.result_Info.student_Id ON
dbo.course_Info.course_Name = dbo.result_Info.course_Name
WHERE dbo.student_Info.student_ID > '10'
ORDER BY dbo.student_Info.student_ID,dbo.student_Info.class_No
Go
图 18-23 SMIS 所 创 建的存 储过 程 对话 框图 18-22 基于 SMIS创 建的 视图 及 运 行 结 果 对话 框本系统中使用存储过程完成了对数据表进行查询的功能,建立了名为 xsglpro的存储过程,
图 18-23所示的是使用查询分析器和 T-SQL语句建立的名为 xsglpro存储过程。存储过程语句如下:
CREATE PROCEDURE xsglpro AS
SELECT TOP 100 PERCENT dbo.student_Info.student_ID,
dbo.student_Info.student_Name,
dbo.student_Info.class_No,dbo.student_Info.tele_Number,
dbo.student_Info.address,
dbo.result_Info.result,dbo.result_Info.course_Name,
dbo.result_Info.exam_No
FROM dbo.result_Info INNER JOIN
dbo.student_Info ON
dbo.result_Info.student_Id = dbo.student_Info.student_ID
WHERE (dbo.student_Info.student_ID > '10')
ORDER BY dbo.student_Info.student_ID DESC
3.创建存储过程存储过程可以使得对数据库的管理、显示数据库及其用户信息的工作变得容易。存储过程以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程可包含程序流、逻辑以及对数据库的查询。
本章介绍了 数据库的规划与设计和学生管理信息系统实例。
数据库设计是在一个给定的应用环境下,确定一个最优数据模型和处理模式,建立数据库及其应用系统,使之能够安全、有效、可靠地存储数据,满足各种用户的应用需求。
数据库设计的内容主要包括两个方面的内容:其一是结构设计,即设计数据库框架或数据库结构;其二为行为设计,也就是应用程序和事务处理等的设计。数据库设计过程主要包括需求分析、概念结构设计、逻辑结构设计、物理结构设计、
数据库实施、数据库运行和维护六个过程。
学生管理信息系统可用来管理学生信息与提高系统管理工作的效率。 SIMS把
Visual Basic(前台开发)与 SQL Server 2000(后台管理)有机地结合,并运用流行的 ADO等相关技术,完成学生信息的规范管理、科学统计和快速查询,从而可大大减少该管理上的工作量。
学生管理信息系统实例首先介绍了系统需求分析、主要任务、系统总体功能模块结构、系统数据流程、数据库概念结构设计、数据库逻辑结构设计、数据库物理结构设计、数据库的实现;其次,详细剖析了 SMIS应用程序的编制,包括创建主控窗体、创建公用模块、创建学籍信息输入窗体、修改学籍信息窗体、查询学籍信息窗体、系统设置类窗体、视图与存储过程的使用等。最后扼要浏览了:添加班级信息、修改班级信息、添加课程信息、添加成绩信息、修改课程信息、修改成绩信息、查询成绩信息等模块。
18-6 本章小结
1,试问数 据 库设计内 容主要包括 哪 些方面。
2,简 述 数 据 库设计 的整 个过 程,并简 要 画 出其 过 程 图 。
3,简 述 实 施 E-R方法的基本步 骤 。
4,简 述 数 据 库实 施的具体步 骤 。
5,试 述 逻辑结构设计 的具体任 务 。
6,简 述 SIMS的主要任 务 。
7,试问创 建 Module1公用模 块 有何益 处?
8,使用 Visual Basic/SQL Server 设计 一 个劳动 工 资 信息管理系 统,基本功能包括:
( 1) 职 工基本信息的添加,删 除、修改 与查询 。
( 2) 职 工工 资 信息的添加,删 除、修改 与查询 。
( 3) 职 工基本信息 与职 工工 资 信息的 统计 和具体 报 表。
习题十八
18-2 SMIS需求分析 与 功能 结构
18-3 SMIS数 据 结构设计 及 实现
18-4 SMIS应 用程序的 编 制
18-5 SQL Server 数 据 库对 象 设计数据库设计是数据库应用的关键技术。本章首先介绍了数据库设计的基本过程,而后基于数据库设技术和 SQL Server 2000知识系统地介绍了学生管理信息系统实例的需求分析、功能结构、数据结构设计与具体实现、
应用程序的编制等内容。
第 18章 SQL Server 应 用 实 例数 据 库设计 是 数 据 库应 用的 关键 技 术 。本章首先介 绍 了 数 据 库设计 的基本 过 程,
而后基于 数 据 库设 技 术 和 SQL Server 2000知 识 系 统 地介 绍 了 学 生管理信息系 统实 例的需求分析、功能 结构,数 据 结构设计与 具体 实现,应 用程序的 编 制等 内 容。
18-1 数 据 库规划与设计数据库规划与设计是数据库应用、信息系统开发和建设的关键问题与核心技术。数据库规划是确定整个系统的数据信息需求,完成系统下数据库及其对象的的设计、系统中关键实体的梳理、属性和它们的组成关系等。数据库设计是指在一个给定的应用环境下,确定一个最优数据模型和处理模式,建立数据库及其应用系统,使之能够安全、有效、可靠地存储数据,满足各种用户的应用需求。数据库设计的内容主要包括两个方面:
其一是结构设计,即设计数据库框架或数据库结构;其二为行为设计,也就是应用程序和事务处理等的设计。数据库设计方法较多,不同法其设计数据库系统的步骤划分也各不相同。著名的新奥尔良方法将数据库设计划分为需求分析、概念设计、逻辑设计和物理逻辑设计四个步骤。随着数据库设计技术的发展与完善,人们又据此导出了新的、更贴近实际的设计步骤。通常采用六个步骤的数据库设计方法,即需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施、数据库运行和维护,图 18-1所示为数据库设计的过程。
物理 设计物理 结构设计设计,性能 预测需求分析概 念 结构设计逻辑设计逻辑结构设计数 据模型 优 化数 据 库实 施物 理 实 现试验 性 运 行数 据 库运 行和 维护图 18-1 数 据 库设计过 程
18-1-1 需求分析用户对数据库的使用要求主要包括对数据及其处理的要求,对数据完整性、安全性的要求。在需求分析阶段主要通过仔细调查准确掌握每一个用户对数据库的要求,
提供后续设计阶段所需的一些内容,主要涉及应用环境分析、数据流程分析、数据需求的收集与分析等。需求分析是整个设计过程的基础,是最困难、最耗损时间的一步,其准确与否将直接影响后 续各个设计阶段。最终将影响到设计结果是否合理和实用。
18-1-2 概 念 结构设计在准确抽象出现实世界的需求并完成需求设计后,就可以考虑如何实现用户的具体要求,进行概念设计了 。 该阶段要做的各种工作不是直接将需求分析得到的数据存储格式转换成数据库管理系统 ( DBMS) 能处理的数据库模式,而是将需求分析得到的用户需求抽象为 反映用户观点的概念模型,即实施概念结构设计 。 概念结构设计是整个数据库设计的关键 。 如前所述,描述概念结构设计的有力工具是实体 -联系 ( E-R) 模型,在此,概念结构设计就归结为
E-R模型,方法的分析与设计 。
E-R方法是面向问题的概念性模型,与数据的存储组织,存取方法,效率等无关,即它不考虑这些数据在 DBMS中态势如何 。
运作 E-R方法的基本步骤如下:
( 1) 划分和确定实体类型与关系类型 。 实体与实体间联系最好为一对多关系 。
( 2) 确定属性 。 找出该实体所融涵的实际属性 。
( 3) 画出 E-R图 。
( 4) 重复步骤 ( 1) 到 ( 3),找出所有实体,关系,属性及属性值集合 。
逻辑结构设计的任务是将概念结构(如 E-R图)转换为与选用数据库管理系统( DBMS)
所支持的数据模型相符的逻辑数据模型,并同时进行数据模型优化。究竟选择哪种数据库管理系统,一般由系统分析员、系统管理员和用户(企业、公司或政府部门的高级管理人员)决定的,需要综合考虑数据库管理系统的性能及所设计的应用系统的功能复杂程度。
在关系型数据库管理系统( RDBMS)中,逻辑结构的设计系指设计数据库中所应包含的各个关系模式的结构,包括关系模式的名称、每一种关系模式各属性的名称、数据类型和取值范围等内容。通常,逻辑结构设计中,概念结构转换过程分成两步进行。首先把概念结构向一般的数据模型转换,然后向特定的数据库管理系统支持下的数据模型转换并进行数据模型优化。
18-1-4 物理 结构设计物理结构设计是为所给定的逻辑结构模型选择最适合应用环境的物理结构,主要是对数据库在物理设备上的存储结构和存取方法的设计。物理结构设计是以逻辑结构设计的结果作为输入,
结合具体数据库管理系统功能及其提供的物理环境与工具、应用环境与数据存储设备,进行数据的存储组织和方法设计,并实施设计与性能预测。
18-1-5 数 据 库实 施数据库实施的主要任务是根据逻辑结构设计与物理结构设计的结果,在系统中建立数据库的结构,载入数据,编制、测试与调试应用程序,对数据库应用系统进行试运行等。
18-1-3 逻辑结构设计数据库实施的具体步骤如下:
( 1)数据库数据的载入和应用程序的编制与调试建立数据库结构;
将原始数据载入数据库;
实施应用程序的编制与调试。
( 2)数据库应用系统的试运行测试系统逻辑功能的完善性;
考察用户需求的吻合程度;
对数据库进行备份。
经过数据库实施阶段的试运行后,系统逻辑功能的完善性与用户需求的吻合程度均已显现并逼近系统要求,且系统已处于一个比较稳定的状态,此时,就可以将系统投入正式运行了。在数据库系统步入运行后,尚需对数据库作经常性的维护,必须不断对其进行评价、调整、修改。该阶段主要涉及如下工作:
( 1)数据库的转储、恢复及数据库的安全性和完整性控制。
( 2)数据库性能的检测、分析、完善,甚至还得对数据库实施更新性操作。
设计一个完整的数据库应用系统,往往是这六大阶段重复运用,不断改进、完善的结果。
18-1-6 数 据 库运 行和 维护随着教育事业的不断发展,学校的规模不断扩大,学生数量及其信息量的急剧增加,有关学生的各种信息管理也随之展开。学生管理信息系统( SMIS,Student Management
Information System)应运而生了,它可用来管理学生信息与提高系统管理工作的效率。
SIMS把 Visual Basic(前台开发)与 SQL Server 2000(后台管理)有机地结合,并运用流行的 ADO等相关技术,完成学生信息的规范管理、科学统计和快速查询,从而可大大减少该管理上的工作量。
数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率以及实现的效果产生影响。合理的数据库结构设计可以提高数据库存储的效率,保证数据的完整性和一致性。同时,合理的数据结构也将有利于程序的顺利实现。
1.需求分析及主要任务系统开发的总体任务是实现学生信息关系的系统化、规范化和自动化。
需求分析是在系统开发总体任务的基础上完成的,设计数据库系统时应该充分了解用户的各方面的需求,包括目前及将来可能拓展的需求态势。因而数据库结构势必要充分满足各种信息的输入和输出。据此,可归结出学生信息管理系统所需完成的主体任务。
SIMS主要任务如下:
( 1) 基本信息的输入。包括学籍(学生基本)信息,班级、课程和成绩等信息的输入。
( 2) 基本信息的修改。 包括 学籍信息,班级、课程和成绩等 信息 的 修改 。
( 3) 基本 信息的查询。包括 学籍信息 和成绩 信息 等的查询。
( 4) 年级信息及 班级信息的设置 等。
( 5) 学校基本课程信息的输入、修改和设置。
( 6) 学籍信息与 课程 信息的统计打印。
( 7) 班级 信息 和成绩 信息 等 的统计打印。
( 8) 软件系统的管理。 包括 学生信息管理系统的初始化、密码设置、用户管理等 。
( 9) 系统帮助。包括 学生信息管理系统的 帮助和系统版本说明等。
18-2 SMIS需求分析 与 功能 结构
2.系统总体功能模块结构基于需求分析及主要任务的表述,可对上述各项功能按照结构化程序设计的要求进行集 中、分层结构化,自上而下逐层设置得到系统功能模块结构图,如图 18-2所示。
图 18-2 系 统 功能模 块结构图添加学籍信息修改学籍信息查询学籍信息打印学籍信息系统初始化用户管理密码管理退出系统打印课程信息设置课程信息添加课程信息修改课程信息添加成绩信息修改成绩信息查询成绩信息打印成绩信息系统帮助成绩管理课程管理学 生信息管理系 统班级管理学籍管理系统管理添加班级信息修改班级信息打印班级信息系统说明关于
3.系统数据流程用户的需求具体体现在各种信息的提供、保存、更新、查询和统计打印上,这就要求数据库结构应充分满足各种信息的输入和输出。系统应定义数据结构、收集基本数据以及设置数据处理的流程,组成一份详尽的数据字典,为而后的具体设计打下基础与伏笔。在仔细分析、
调查有关学生信息管理需要的基础上,得到本系统的数据流程图,如图 18-3所示。
表信息学 生 综 合信息查询处 理信息学 生 综 合信息教务处学 生院系等查询处 理打印数 据处 理系 统 信息学 生信息课 程信息管理 员学 生信息成 绩 信息表 班 级 信息表学 籍信息表 系 统 信息表课 程 设 置表报 表 综合信息图 18-3 系 统数 据 数 据流程 图
18-3 SMIS数 据 结构设计 及 实现
1,数 据 库概 念 结构设计 表信息概 念 结构设计 就是 E-R方法的分析 与设计,概 念 结构设计 是整 个数 据 库设计 的 关键 。在此,将 使用 实 体 -联 系( E-R)模型 来 描述系 统 的 概 念 结构,同 时设计 出能 够满 足用 户 需求的各 种实 体,以及 它们 之 间 的 关 系,为 后面的 逻辑结构设计 打下基 础 。 这 些 实 体包含各 种 具体 实际 信息,通 过 相互之 间 的作用形成 数 据的流 动 。
本程序根据上面的 设计规划 出的 实 体有,学 籍 实 体、班 级实 体、年 级实 体,课 程 实 体 与 成 绩实 体,
它们 的 E-R图 如 图 18-4所示。
学号课程编号课程名称课程描述课程类型年级设置属于班级课程设置上课课程联系电话姓名 班级编号性别 备注出生日期 入校时间 家庭地址学号学籍年级信息属 于成绩 考试班号年级班主任姓名教室 考试编号分数年级 课程名称课程学分图 18-4 学 生管理信息系 统 ER图
2.数据库逻辑结构设计针对一般学生信息管理系统的总体需求,通过对学生信息管理过程的内容和数据流程分析与系统总体功能模块梳理,可归结出系统数据库的逻辑结构,设计、
产生如下所示的 数据项和数据结构,
( 1)学生基本信息(学籍信息)数据项为:学号、姓名、性别、出生日期、班号、联系电话、入校时间、家庭地址、备注等。
( 2)班级基本数据项为:班号、年级、班主任姓名、教室等。
( 3)课程基本数据项为:课程号、课程名称、课程类型、课程描述等。
( 4) 课程基本设置数据项为:包括的数据项有,年级,课程学分,所学课程等 。
( 5) 成绩基本数据项为:学号,考试编号,班级,课程名称,考试分数等 。
3.数据库物理结构设计基于上述的数据库概念结构与数据库逻辑结构设计的结果,现可以实施将其转化为 SQL
Server 2000数据库系统所支持的实际数据模型:数据表对象(即为它们 选择最适合应用环境,对数据库在物理设备上的存储结构和存取方法予以设计 ),并形成数据库中各个表格之间的关系。学生信息管理系统数据库中各个表格的设计结果如表 18-1至表 18-6所示。
4.数据库的实现经过前面对需求分析和概念结构设计以后,得到数据库的逻辑结构。现在就可以在 SQL
Server 2000数据库的系统中实现该逻辑结构。利用 SQL Server 2000 数据库系统中的
SQL查询分析器实现,
列(字段)名 数 据 类 型 与长 度 空 否 说 明
student_ID Char(4) Not null 学号 ( 学 生 学号,主 键 )
student_Name Char(10) Not null 姓名 ( 学 生姓名 )
student_Gender Char(2) Not null 性 别 ( 学 生性 别 )
born_Date Datetime(8) Not null 出生日期
class_No Char(4) Not null 班 号 ( 班 级编号,外 键 )
tele_Number Char(16) Null 联 系 电话
ru_Date Datetime(8) Null 入校 时间
Address Varchar(50) Null 家庭地址
Comment Varchar(200) Null 备 注表 18-1 Student_Info 学 籍信息表列 ( 字段 ) 名 数据类型与长度 空 否 说 明
Exam_No Char(10) Not null 考试编号 ( 主键 )
Student_Id Char(4) Not null 学生学号 ( 学号:外键 )
Student_Name Char(10) Not null 学生姓名 ( 姓名 ),可略
Class_No Char(10) Not null 班号 ( 班级编号:外键 )
Course_Name Char(10) Null 课程名称
Mark Float(8) Null 分数列 ( 字段 ) 名 数据类型与长度 空 否 说 明
class_No Char(10) Not null 班号 ( 班级编号:主键 )
Grade Char(10) Not null 年级 ( 外键 )
Director Char(10) Null 班主任姓名
Classroom_No Char(10) Null 教室 ( 所在教室 )
表 18-2 result_Info 学生成绩信息表表 18-3 Class_Info 班级信息表列(字段)名 数 据 类 型 与长 度 空 否 说 明
Grade Char(10) Not null 年 级 ( 主 键 )
course_Name Char(10) Not null 课 程名 称
course_Mark Float(8) Not null 课 程分 数列 ( 字段 ) 名 数 据 类 型 与长 度 空 否 说 明
Course_No Char(10) Not null 课 程 编号 ( 主 键 )
Course_Name Char(20) Null 课 程名 称
Course_Type Char(10) Null 课 程 类 型
Course_Des Text Null 课 程描述列 ( 字段 ) 名 数 据 类 型 与长 度 空 否 说 明
user_ID Char(10) Not null 用 户 名 称 ( 主 键 )
user_PWD Char(10) Not null 用 户 密 码
user_DES Char(10) Null 用 户 描述表 18-4 gradecourse_Info 年 级课 程 设 置表表 18-5 course_Info 课 程基本信息 表表 18-6 User_Info 系 统 用 户 表
4.数据库的实现具体语句如下 。
( 1)创建学生数据库
CREATE DATABASE xsgl
ON PRIMARY
(NAME=xsgl_dat,FILENAME='D:\xsgl\xsgl.mdf',
SIZE=10,MAXSIZE =20,FILEGROWTH = 5%),
FILEGROUP data1
(NAME=xsglgroup_dat,FILENAME='D:\xsgl\xsglgroup.ndf',
SIZE=2,MAXSIZE=100,FILEGROWTH=1),
LOG ON
(NAME='xsgl_log1',FILENAME='D:\xsgl\ xsgl_log1.ldf',
SIZE = 10MB,MAXSIZE=25MB,FILEGROWTH=5% )
Go
( 2) 创建学籍 ( 学生基本信息 ) 表
CREATE TABLE student_Info (
student_ID char (4) primary key,
student_Name char (10),
student_Sex char (2),
born_Date datetime,
class_NO char (4),
tele_Number char (10) NULL,
ru_Date datetime NULL,
address varchar (50) NULL,
comment Text)
go
( 3)创建学生成绩信息表
CREATE TABLE result_Info (
exam_No char (10) primary key,
student_ID char (4) NOT NULL,
student_Name char (10) NOT NULL,
class_No Char(10) NOT NULL,
course_Name char (10) NULL,
result float NULL)
go
( 4)创建班级信息表
CREATE TABLE class_Info (
class_No char (10) primary key,
grade char (10),
director char (10) NULL,
classroom_No char (10) NULL)
go
( 5)创建年级课程信息表
CREATE TABLE [dbo].[gradecourse_Info] (
Grade char (10) primary key,
course_Name char (10) NULL
result float NULL)
go
( 6)创建课程基本信息表
CREATE TABLE course_Info (
course_No char (4) primary key,
course_Name char (10) NULL,
course_Type char (10) NULL,
course_Des char] (50) NULL)
go
( 7)创建系统用户表
CREATE TABLE user_Info (
user_ID char(10) NOT NULL,
user_PWD char (10) NOT NULL,
user_Des char] (10) NULL)
go
上述 SQL语句在 SQL Server 2000的查询分析中执行后,可便捷而自动地产生所需的数据表。现在将基于 Visual Basic前台开发与 SQL Server 2000后台管理的有机结合来实施系统设置和应用程序编制,即通过 VB来编写数据库系统的客户端程序,且 系统采用 ADO对象访问技术来访问数据库。
1.创建主控窗体
Visual Basic开发的应用程序界面有,SDI(单文档界面),MDI(多文档界面)和资源管理器界面三种,在 MDI程序由一个主窗体和若干个 MDI子窗体构成。本应用系统实例主要基于多文档界面,如此可以更加美观、界面友好、整齐有序。图 18-5即为融含菜单的学生管理信息系统主控窗体。在主窗体的 load()事件里,设置了系统的登录日期与登录时间。
18-4 SMIS应 用程序的 编 制
Private Sub MDIForm_Load()
FrmMain.StatusBarMy.Panels.Item(2).Text = "登录日期," & Date
FrmMain.StatusBarMy.Panels.Item(3).Text = "登录时间," & Time
End Sub
图 18-5 SMIS系 统 的主窗体 对话 框
2.创建公用模块
( 1)创建 Module1公用模块在 VB中可用公用模块来存放整个工程项目中的公用函数、全局变量等。整个工程项目中的任何地方都可以调用公用模块中的函数、变量,这样可以极大地提高代码的效率。在此,系统在项目资源管理器中设置了一个 Module1公用模块,保存为 Module1.bas,以资系统共享。代码如下:
Public Function ExecuteSQL(ByVal SQL As String,MsgString As String) As ADODB.Recordset
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sTokens() As String
On Error GoTo ExecuteSQL_Error
sTokens = Split(SQL)
Set cnn = New ADODB.Connection
cnn.Open ConnectString
If InStr("Insert,Delete,Update",UCase$(sTokens(0))) Then
cnn.Execute SQL
MsgString = sTokens(0) & "query successful"
Else
Set rst = New ADODB.Recordset
rst.Open (SQL),cnn,adOpenKeyset,adLockOptimistic
Set ExecuteSQL = rst
MsgString = "查询到 " & rst.RecordCount & "条记录 "
End If
ExecuteSQL_Exit:
Set rst = Nothing
Set cnn = Nothing
Exit Function
ExecuteSQL_Error:
MsgString = "查询错误," & Err.Description
Resume ExecuteSQL_Exit
End Function
Public Function ConnectString() As String
ConnectString = "provider=sqloledb;uid=sa;pwd=sayu;database=xsgl"
End Function
Sub Main()
Dim fLogin As New FrmLogin
fLogin.Show vbModal
If Not fLogin.OK Then
End
End If
Unload fLogin
Set fMainForm = New FrmMain
fMainForm.Show
End Sub
ExecuteSQL函数附有两个参数,SQL和 MsgString,前者用来存放需要执行的 SQL语句,
后者( MsgString)用来返回执行的提示信息。函数运行时,首先判断 SQL语句所含的内容:
当执行查询操作时,ExecuteSQL函数将返回一个与函数同名的包含满足条件记录的记录集对象( Recordset);否则执行添加、删除、更新等操作时,不返回记录集对象。
ExecuteSQL函数中调用了 ConnectString()子函数用以连接 xsgl数据库。
由于在后面的程序中,需要频繁检查、判断文本框的内容是否为空,在此尚定义了一个
Testtxt函数,以资调用。代码如下:
Public Function Testtxt(txt As String) As Boolean
If Trim(txt) = "" Then
Testtxt = False
Else
Testtxt = True
End If
End Function
若文本框的内容为空函数将返回 True,否则为 False。
( 2)创建身份认证窗体软件中设置了用户登录应用系统时的身份认证机制,通过用户名与密码核对来防止非法者使用学生管理信息系统,如图 18-6所示。
Dim txtSQL As String,mrc As ADODB.Recordset,MsgText As String
UserName = ""
If Trim(txtUserName.Text = "") Then
MsgBox "用户名不为空,请重新输入! ",vbOKOnly + vbExclamation,"警告 "
txtUserName.SelStart=0:txtUserName.SelLength = Len(txtUserName.Text)
txtUserName.SetFocus:Exit Sub
Else
txtSQL = "Select * from user_info where user_ID='" & Trim(txtUserName.Text) &
"'"
Set mrc = ExecuteSQL(txtSQL,MsgText)
If mrc.EOF = True Then
MsgBox "用户名出错,请重新输入! ",vbOKOnly + vbExclamation,"警告 "
txtUserName.SelStart=0:txtUserName.SelLength = Len(txtUserName.Text)
txtUserName.SetFocus:Exit Sub
Else
If Trim(mrc.Fields(1)) = Trim(txtPassword.Text) Then
OK = True:mrc.Close:UserName = Trim(txtUserName.Text)
FrmMain.Show:Unload Me
Else
MsgBox "密码出错,请重新输入! ",vbOKOnly + vbExclamation,"警告 "
txtPassword.Text="":txtPassword.SetFocus:Exit Sub
End If
End If
End If
miCount = miCount + 1
If miCount = 3 Then
MsgBox "尝试数超过 3次,您无权使用本程序 ",vbExclamation,"警告 "
End
End If
End Sub
该模块允许用户登录差错三次,否则自动锁断系统,拒绝再度登录。
3.创建学籍信息输入窗体启动学籍信息输入窗体是使用主窗体的菜单项完成的,具体过程语句如下:
Private Sub mnuAddInfo_Click()
Frmsinfo.Move 0,0
Frmsinfo.Height = 4810
Frmsinfo.Width = 6830
Frmsinfo.Show ‘ 激活、启动学籍信息输入窗体
End Sub
选择“学籍管理”菜单的“添加学籍信息”项,出现 如图 18-7所示的 窗体界面。窗体加载时通过
load()事件对窗体进行初始化,其代码如下:
Private Sub Form_Load()
Dim mrc As ADODB.Recordset:Dim txtSQL As String
Dim MsgText As String:Dim i As Integer
cboGender.AddItem ""
cboGender.AddItem "男 "
cboGender.AddItem "女 "
txtSQL = "Select * from class_Info"
Set mrc = ExecuteSQL(txtSQL,MsgText)
mrc.MoveFirst
cboClassNumber.AddItem ""
For i = 1 To mrc.RecordCount
cboClassNumber.AddItem mrc.Fields(0)
mrc.MoveNext
Next
mrc.Close
End Sub
1) 学籍信息输入窗体中的,确认添加,按钮,首先把用户输入的信息进行有效性检验,然后才把信息添加到数据库的表中 。
( 1) 输入过程的有效性检验 。
Private Sub cmdOK_Click() '添加新记录
Dim mrc As ADODB.Recordset
Dim txtSQL As String
Dim MsgText As String
If Not Testtxt(txtId.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入学号! "
txtId.SetFocus:Exit Sub
End If
If Not Testtxt(txtName.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入姓名! "
txtName.SetFocus:Exit Sub
End If
If Not Testtxt(cboGender.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请选择性别! "
cboGender.SetFocus:Exit Sub
End If
If Not Testtxt(txtBirthday.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入出生日期! "
txtBirthday.SetFocus:Exit Sub
End If
If Not Testtxt(cboClassNumber.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请选择班级! "
cboClassNumber.SetFocus:Exit Sub
End If
If Not Testtxt(txtPhone.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入联系电话! "
txtPhone.SetFocus:Exit Sub
End If
If Not Testtxt(txtDate.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入入校日期! "
txtDate.SetFocus:Exit Sub
End If
If Not Testtxt(txtAddress.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入家庭地址! "
txtAddress.SetFocus:Exit Sub
End If
If Not IsNumeric(Trim(txtPhone.Text)) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "联系电话应该是数字型! "
txtPhone.SelStart=0:txtPhone.SelLength = Len(txtPhone.Text)
txtPhone.SetFocus,Exit Sub
End If
If Not IsNumeric(Trim(txtId.Text)) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "学号应该是数字型! "
txtId.SelStart = 0:txtId.SelLength = Len(txtId.Text)
txtId.SetFocus,Exit Sub
End If
If Not IsDate(Trim(txtBirthday.Text)) Then
MsgBox "出生日期输入有误! "&Chr(13)&"举例:( 2003-08-08) ",_
vbOKOnly + vbExclamation,"提示 "
txtBirthday.SelStart=0:txtBirthday.SelLength = Len(txtBirthday.Text)
txtBirthday.SetFocus:Exit Sub
Else
txtBirthday = Format(txtBirthday,"yyyy-mm-dd")
End If
If Not IsDate(Trim(txtDate.Text)) Then
MsgBox "入校日期输入有误! " & Chr(13) & "举例:( 2003-1-1) ",_
vbOKOnly + vbExclamation,"提示 "
txtDate.SelStart = 0:txtDate.SelLength = Len(txtDate.Text)
txtDate.SetFocus:Exit Sub
Else
txtDate = Format(txtDate,"yyyy-mm-dd")
End If
( 2)向数据表中写入数据信息。
txtSQL ="Select * from student_Info where student_ID='" & Trim(txtId.Text)
& _
"'"&" and class_No='"&Trim(cboClassNumber.Text) & "'"
Set mrc = ExecuteSQL(txtSQL,MsgText)
If mrc.EOF = False Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "该班级中已经存在此学号,请重新输入! "
mrc.Close:txtId.SelStart = 0
txtId.SelLength = Len(txtId.Text)
txtId.SetFocus:Exit Sub
Else
mrc.AddNew:mrc.Fields(0) = Trim(txtId.Text)
mrc.Fields(1) = Trim(txtName.Text)
mrc.Fields(2) = Trim(cboGender.Text)
mrc.Fields(3) = Trim(txtBirthday.Text)
mrc.Fields(4)=Trim(cboClassNumber.Text)
mrc.Fields(5) = Trim(txtPhone.Text):mrc.Fields(6) = Trim(txtDate.Text)
mrc.Fields(7) = Trim(txtAddress.Text):mrc.Fields(8) = Trim(txtComment.Text)
mrc.Update
FrmMain.StatusBarMy.Panels.Item(1).Text = "添加学籍信息成功! "
mrc.Close
End If
End Sub
2)学籍信息输入窗体中的“取消添加”按钮,用来取消本次添加操作。
Private Sub cmdCancel_Click() '取消本次并退出本窗体
FrmMain.StatusBarMy.Panels.Item(1).Text = ""
Unload Me
End Sub
3)学籍信息输入窗体中的“清空”按钮,用来取消在窗体中输入的学籍信息。
Private Sub cmdClear_Click() ' 清空各添加框信息
txtId.Text = ""
txtName.Text = ""
cboGender.ListIndex = 0
txtBirthday.Text = ""
cboClassNumber.ListIndex = 0
txtPhone.Text = ""
txtDate.Text = ""
txtAddress.Text = ""
txtComment.Text = ""
FrmMain.StatusBarMy.Panels.Item(1).Text = ""
End Sub
4.修改学籍信息窗体选择“学籍管理”菜单的“添加学籍信息”项,出现如图 18-7与图 18-8所示的窗体界面。
在该窗体中,即可以一般的浏览查询(可进行记录指针的相对移动:上移一条记录、
下移一条记录、记录指针指向首记录和针指向末记录),也可以进入修改分支,实施数据修改、改好以后更新存盘、退出修改和删除记录。具体代码分解如下:
图 18-7 学 籍信息修改 -浏览状态对话 框图 18-8 学 籍信息修改 -修改 状态对话 框
( 1)窗体的载入事件,Form_Load()。
Private Sub Form_Load()
Dim txtSQL As String,Dim MsgText As String
txtSQL = "Select * from student_Info",Set mrc = ExecuteSQL(txtSQL,MsgText)
mrc.MoveFirst ' 显示第一条记录
If mrc.EOF Then
MsgBox "表信息已空!! "
End If
Call viewData,mcclean = True
txtId.Enabled = False ' 设置窗体信息不可修改
txtName.Enabled = False
cboGender.Enabled = False
txtBirthday.Enabled = False
cboClassNumber.Enabled = False
txtPhone.Enabled = False
txtDate.Enabled = False
txtAddress.Enabled = False
txtComment.Enabled = False
End Sub
( 2)窗体信息的浏览查询。
Private Sub cmdFirst_Click() ' 显示第一条记录
mrc.MoveFirst,Call viewData
End Sub
Private Sub cmdPrevious_Click() '显示当前记录的上一条记录
mrc.MovePrevious
If mrc.BOF Then
mrc.MoveLast
End If
Call viewData
End Sub
Private Sub cmdNext_Click() '显示当前记录的下一条记录
mrc.MoveNext
If mrc.EOF Then
mrc.MoveFirst
End If
Call viewData
End Sub
Private Sub cmdLast_Click() '显示最后一条记录
mrc.MoveLast,Call viewData
End Sub
( 3)修改窗体的学籍信息。
Private Sub cmdEdit_Click() '进入修改状态,且移动按钮不可用!
mcclean = False,cmdFirst.Enabled = False,cmdPrevious.Enabled = False
cmdNext.Enabled = False,cmdLast.Enabled = False
txtId.Enabled = True ' 设置学籍信息可修改,Enabled属性有效
txtName.Enabled = True
cboGender.Enabled = True,txtBirthday.Enabled = True
cboClassNumber.Enabled = True,txtPhone.Enabled = True
txtDate.Enabled = True,txtAddress.Enabled = True
txtComment.Enabled = True,sFlag = txtId.Text
FrmMain.StatusBarMy.Panels.Item(1).Text = "当前是修改状态 "
End Sub
( 4)更新窗体的学籍信息。
Private Sub cmdUpdate_Click() ' 把修改后的内容加到数据库中
Dim txtSQL As String,Dim MsgText As String
Dim mrc As ADODB.Recordset
If mcclean Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请先点击修改记录按钮,进入修改状态 "
Exit Sub
End If
If Not Testtxt(txtId.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入学号! "
txtId.SetFocus,Exit Sub
End If
If Not Testtxt(txtName.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入姓名! "
txtName.SetFocus,Exit Sub
End If
If Not Testtxt(cboGender.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请选择性别! "
cboGender.SetFocus,Exit Sub
End If
If Not Testtxt(txtBirthday.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入出生日期! "
txtBirthday.SetFocus,Exit Sub
End If
If Not Testtxt(cboClassNumber.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请选择班级! "
cboClassNumber.SetFocus,Exit Sub
End If
If Not Testtxt(txtPhone.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入联系电话! "
txtPhone.SetFocus,Exit Sub
End If
If Not Testtxt(txtDate.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入入校日期! "
txtDate.SetFocus,Exit Sub
End If
If Not Testtxt(txtAddress.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入家庭地址! "
txtAddress.SetFocus,Exit Sub
End If
If Not IsNumeric(txtPhone.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "联系电话应该是数字型! "
txtPhone.SelStart = 0,txtPhone.SelLength = Len(txtPhone.Text)
txtPhone.SetFocus
Exit Sub
End If
If Not IsNumeric(Trim(txtId.Text)) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "学号应该是数字型! "
txtId.SelStart = 0,txtId.SelLength = Len(txtId.Text),txtId.SetFocus
Exit Sub
End If
If Not IsDate(Trim(txtBirthday.Text)) Then
vbOKOnly + vbExclamation,"提示 "
FrmMain.StatusBarMy.Panels.Item(1).Text = "出生日期输入有误! " _
& Chr(13) & "举例:( 1983-1-1) "
txtBirthday.SelStart = 0,txtBirthday.SelLength = Len(txtBirthday.Text)
txtBirthday.SetFocus,Exit Sub
Else
txtBirthday = Format(txtBirthday,"yyyy-mm-dd")
End If
If Not IsDate(txtDate.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "入校日期输入有误! " _
& Chr(13) & "举例:( 2003-1-1) "
txtDate.SelStart = 0,txtDate.SelLength = Len(txtDate.Text)
txtDate.SetFocus,Exit Sub
Else
txtDate = Format(txtDate,"yyyy-mm-dd")
End If
txtSQL = "Select * from student_Info where student_ID='" & Trim(txtId.Text) & _
"'" & " and class_No='" & Trim(cboClassNumber.Text) & "'"
Set mrc = ExecuteSQL(txtSQL,MsgText)
If mrc.EOF = False And Trim(txtId.Text) <> sFlag Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "该班级已存在此学号,请重新输入学号! "
txtId.SelStart = 0,txtId.SelLength = Len(txtId.Text)
txtId.SetFocus,Exit Sub
Else
txtSQL = "Select * from student_Info where student_ID='" & Trim(sFlag) & "'"
Set mrc = ExecuteSQL(txtSQL,MsgText) '更新数据
mrc.Fields(0) = Trim(txtId.Text),mrc.Fields(1) = Trim(txtName.Text)
mrc.Fields(2) = Trim(cboGender.Text),mrc.Fields(3) = Trim(txtBirthday.Text)
mrc.Fields(4) = Trim(cboClassNumber.Text),mrc.Fields(5) = Trim(txtPhone.Text)
mrc.Fields(6) = Trim(txtDate.Text),mrc.Fields(7) = Trim(txtAddress.Text)
mrc.Fields(8) = Trim(txtComment.Text),mrc.Update
FrmMain.StatusBarMy.Panels.Item(1).Text = "修改学籍信息成功! "
cmdFirst.Enabled = True,cmdPrevious.Enabled = True
cmdNext.Enabled = True,cmdLast.Enabled = True
txtId.Enabled = False,txtName.Enabled = False
cboGender.Enabled = False,txtBirthday.Enabled = False
cboClassNumber.Enabled = False,txtPhone.Enabled = False
txtDate.Enabled = False,txtAddress.Enabled = False
txtComment.Enabled = False,mcclean = True
End If
End Sub
( 5)退出修改状态。
Private Sub cmdCancel_Click() ' 退出修改状态
If Not mcclean Then
cmdFirst.Enabled = True,cmdPrevious.Enabled = True
cmdNext.Enabled = True,cmdLast.Enabled = True
txtId.Enabled = False,txtName.Enabled = False
cboGender.Enabled = False,txtBirthday.Enabled = False
cboClassNumber.Enabled = False,txtPhone.Enabled = False
txtDate.Enabled = False,txtAddress.Enabled = False
txtComment.Enabled = False,mcclean = True
End If
Call viewData,FrmMain.StatusBarMy.Panels.Item(1).Text = ""
End Sub
( 6)删除当前记录。
Private Sub cmdDelete_Click() ' 删除当前记录
sFlag = MsgBox("是否删除当前记录? ",vbOKCancel,"删除记录 ")
If sFlag = vbOK Then
mrc.MoveNext
If mrc.EOF Then
mrc.MovePrevious,mrc.Delete
Else
mrc.MovePrevious,mrc.Delete
FrmMain.StatusBarMy.Panels.Item(1).Text = "成功删除 !"
End If
Else
Exit Sub
End If
End Sub
5.查询学籍信息窗体选择“学籍管理”菜单的“查询学籍信息”项,出现如图 18-9和图 18-10所示的窗体界面。
在该窗体中,可以进行三种最常用的条件性查询:按学号条件查询、按姓名条件查询和按班级条件查询。该窗体上部是以表格的方式显示符合条件的学籍信息,下部“查询记录”
中有三个复选框(按学号、按姓名、按班级),通过选择复选框及“查询”按钮即可显示相关信息。图中也可以使用“清空”按钮将窗体上部表格中的学籍信息清除。
图 18-11 添加用 户对话 框具体程序代码入下:
Private Sub cmdInquire_Click() ' 按条件查询
Dim txtSQL As String,Dim MsgText As String
Dim dd(4) As Boolean '记录复选框的选择情况
Dim mrc As ADODB.Recordset
msgFlexgrid.Clear
txtSQL = " Select * from student_Info where "
If chkId.Value = 1 Then ' 选中按学号查询
If Trim(txtId.Text = "") Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "如果要按学号查询,请输入学号 "
txtId.SetFocus,Exit Sub
Else
If Not IsNumeric(Trim(txtId.Text)) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "学号必须为数字型 !"
txtId.SetFocus,Exit Sub
End If
dd(0) = True ' 设置按学号查询逻辑值
txtSQL = txtSQL & "student_Id='" & Trim(txtId.Text) & "'"
End If
End If
If chkName.Value = 1 Then ' 选中按姓名查询
If Trim(txtName.Text = "") Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "如果要按姓名查询,请输入姓名 "
txtName.SetFocus,Exit Sub
Else
dd(1) = True ' 设置按姓名查询逻辑值
If dd(0) = True Then
txtSQL = txtSQL & "and student_Name='" & Trim(txtName.Text) & "'"
Else
txtSQL = txtSQL & "student_Name='" & Trim(txtName.Text) & "'"
End If
End If
End If
If chkClassId.Value = 1 Then ' 选中按班级查询
If Trim(txtClassId.Text) = "" Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "如果要按班级查询,请输入班级 "
txtClassId.SetFocus,Exit Sub
Else
dd(2) = True ' 设置按班级查询逻辑值
If Not IsNumeric(Trim(txtClassId.Text)) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "班级必须为数字型 !"
txtId.SetFocus,Exit Sub
End If
If dd(0) = True And dd(1) = True Then
txtSQL = txtSQL & "and class_No='" & Trim(txtClassId.Text) & "'"
Else
txtSQL = txtSQL & "class_No='" & Trim(txtClassId.Text) & "'"
End If
End If
End If
If Not (dd(0) Or dd(1) Or dd(2) Or dd(3)) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "您还没输入查询方式呢 !"
txtId.SetFocus,Exit Sub
End If
txtSQL = txtSQL & "order by student_id",Set mrc = ExecuteSQL(txtSQL,MsgText)
With msgFlexgrid ' 显示表格头
.Row = 1
.CellAlignment = 4
.TextMatrix(0,0) = "学号 "
.TextMatrix(0,1) = "姓名 "
.TextMatrix(0,2) = "性别 "
.TextMatrix(0,3) = "出生日期 "
.TextMatrix(0,4) = "班号 "
.TextMatrix(0,5) = "联系电话 "
.TextMatrix(0,6) = "入校时间 "
.TextMatrix(0,7) = "家庭住址 "
Do While Not mrc.EOF ' 循环显示学籍信息
.Row =,Row + 1
.CellAlignment = 4
.TextMatrix(.Row - 1,0) = mrc.Fields(0)
.TextMatrix(.Row - 1,1) = mrc.Fields(1)
.TextMatrix(.Row - 1,2) = mrc.Fields(2)
.TextMatrix(.Row - 1,3) = Format(mrc.Fields(3),"yyyy-mm-dd")
.TextMatrix(.Row - 1,4) = mrc.Fields(4)
.TextMatrix(.Row - 1,5) = mrc.Fields(5)
,TextMatrix(.Row - 1,6) = Format(mrc.Fields(6),"yyyy-mm-dd")
.TextMatrix(.Row - 1,7) = mrc.Fields(7)
mrc.MoveNext
Loop
End With
mrc.Close
End Sub
6.系统设置类窗体学生管理信息系统还提供了若干系统 选择设置类窗体,如添加用户、设置密码、设置年级课程和系统初试化等程序模块。可用来添加系统的用户(包括输入用户名、登录密码等);
使用若干时间后,可酌情修改密码(选择易于记忆或有意义的密码);随着变化可以设置各年级富有新意或应用特征及时代意义的不同年级的相关课程;系统也可按需设置初始化性质的数据,各种专业的额定学分、基础课的增设与课时调整(如增设 3个代表基础课、调整哲学课的学时数等)、专业课课时的调整(如强化面向应用型课程教学的课时数)等。
1)添加用户添加用户的窗体如图 18-11所示,代码如下。
Private Sub cmdOK_Click() ' 添加新用户
Dim txtSQL As String,mrc As ADODB.Recordset,MsgText As String
If Trim(txtUserName.Text) = "" Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "请输入用户名 "
txtUserName.SetFocus,Exit Sub
Else
txtSQL = "Select * from user_info",Set mrc = ExecuteSQL(txtSQL,MsgText)
While (mrc.EOF = False)
If Trim(mrc.Fields(0)) = Trim(txtUserName.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "该用户已存在,请重输! "
txtUserName.SetFocus
txtUserName.Text = "",txtPassword1.Text = "",txtPassword2.Text = ""
Exit Sub
Else
mrc.MoveNext
End If
Wend
End If
If Trim(txtPassword1.Text) = "" Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "为了安全,密码不为空! "
txtPassword1.SetFocus,txtPassword1.Text = "",txtPassword2.Text = ""
Else
If Trim(txtUserName.Text) <> Trim(txtPassword2.Text) Then
FrmMain.StatusBarMy.Panels.Item(1).Text = "密码输入不一致 !"
txtPassword1.SetFocus,txtPassword1.Text = "",txtPassword2.Text = ""
Exit Sub
Else
mrc.AddNew ' 添加新记录并写入表内
mrc.Fields(0) = Trim(txtUserName.Text)
mrc.Fields(1) = Trim(txtPassword1.Text)
mrc.Update
mrc.Close
Me.Hide
FrmMain.StatusBarMy.Panels.Item(1).Text = "添加用户成功 !"
End If
End If
End Sub
2)设置年级课程设置年级课程的窗体如图 18-12所示,其中可以由组合框选择年级,点击“课程设置”按钮,在左侧的“所有课程”列表框中会显示已开设的所有课程,通过点击 按钮可添加到“已选择的课程” 列表框中,反之,也可移出该列表框。最后,通过点击“确认添加”按钮完成年级课程的设置。设置年级课程程序代码如下。
图 18-12 设 置年 级课 程 对话 框
( 1) 设置年级课程窗体的载入事件,Form_Load ()用于产生可供选择的年级项 。
Private Sub Form_Load()
cboGrade.AddItem " "
cboGrade.AddItem "大一 "
cboGrade.AddItem "大二 "
cboGrade.AddItem "大三 "
cboGrade.AddItem "大四 "
End Sub
( 2)选择课程到,已选择的课程” 列表中。
Private Sub cmdAdd_Click()
把 lstAllCourse(所有课程列表)的选中项添加到 lstSelectCourse(已选择的课程)中去
Dim i As Integer
If lstAllCourse.ListIndex <> -1 Then
sFlag = 0
For i = 1 To lstSelectCourse.ListCount
If Trim(lstAllCourse.List(lstAllCourse.ListIndex)) = Trim(lstSelectCourse.List(i))
Then
sFlag = 1 ' 判断选中项是否存在于 lstSelectCourse中
End If
Next
If sFlag = 0 Then
lstSelectCourse.AddItem lstAllCourse.List(lstAllCourse.ListIndex)
End If
End If
End Sub
( 3)从,已选择的课程” 列表中移出所选课程。
Private Sub cmdDelete_Click() ' 移出 lstAllCourse()的选中项
If lstSelectCourse.ListIndex <> -1 Then
lstSelectCourse.RemoveItem lstSelectCourse.ListIndex
End If
End Sub
( 4)从表中取出并 显示已开设的课程。
Private Sub cmdSet_Click() ' 功能是进入课程设置,显示已开设的课程
Dim mrc As ADODB.Recordset,Dim txtSQL As String,Dim MsgText As String
Dim i As Integer
lstAllCourse.Enabled = True,lstSelectCourse.Enabled = True
cmdModify.Enabled = True,cmdAdd.Enabled = True
cmdDelete.Enabled = True
lstAllCourse.Clear ' 清空所有课程列表 lstAllCourse
lstSelectCourse.Clear ' 清空已选择课程列表 lstSelectCourse
txtSQL = "Select * from course_Info" ' 从 course_Info课程表中取出所有已开设的课程
Set mrc = ExecuteSQL(txtSQL,MsgText)
While (mrc.EOF = False)
lstAllCourse.AddItem mrc.Fields(1)
mrc.MoveNext
Wend
txtSQL = "Select * from gradecourse_Info" ' 从 gradecourse_Info表中年级与课程
Set mrc = ExecuteSQL(txtSQL,MsgText)
mrc.MoveFirst
While Not mrc.EOF
If cboGrade.Text = Trim(mrc.Fields(0)) Then
lstSelectCourse.AddItem mrc.Fields(1)
End If
mrc.MoveNext
Wend
mrc.Close
End Sub
( 5)点击,确认添加,按钮,确认所设置的 课程。
Private Sub cmdModify_Click() ' 功能是把最终结果加到数据库中
Dim i As Integer,Dim mrc As ADODB.Recordset
Dim txtSQL As String,Dim MsgText As String
txtSQL = "select * from gradecourse_Info where grade='" & Trim(cboGrade.Text) & "'"
Set mrc = ExecuteSQL(txtSQL,MsgText)
If mrc.EOF Then
For i = 1 To lstSelectCourse.ListCount
mrc.AddNew,mrc.Fields(0) = Trim(cboGrade.Text)
mrc.Fields(1) = Trim(lstSelectCourse.List(i - 1)),mrc.Update
Next
mrc.Close
FrmMain.StatusBarMy.Panels.Item(1).Text = "课程设置成功 !"
Else
txtSQL = "delete from gradecourse_Info where grade='" & _
Trim(cboGrade.Text) & "'"
Set mrc = ExecuteSQL(txtSQL,MsgText)
txtSQL = "select * from gradecourse_Info"
Set mrc = ExecuteSQL(txtSQL,MsgText)
For i = 1 To lstSelectCourse.ListCount
mrc.AddNew
mrc.Fields(0) = Trim(cboGrade.Text)
mrc.Fields(1) = Trim(lstSelectCourse.List(i - 1))
mrc.Update
Next
mrc.Close
FrmMain.StatusBarMy.Panels.Item(1).Text = "课程设置成功 !"
End If
End Sub
7.其他类窗体除上述窗体外,尚有:添加班级信息(如图 18-13)、修改班级信息(如图 18-14)、添加课程信息(如图 18-15)、添加成绩信息(如图 18-16)、修改课程信息(如图 18-17)、
修改成绩信息(如图 18-18)、打印成绩信息、查询成绩信息(如图 18-19)、系统使用说明和关于系统的版本说明(如图 18-20)等模块。由于它们的语句代码编制技巧和前面所述雷同,鉴于篇幅原因就不作详细介绍了。各个窗体中的,退出,按钮代码一样,都在按钮的
click事件下添加,Unload Me” 代码。
图 18-13 添加班 级 信息 对话 框 图 18-14 修改班 级 信息 对话 框图 18-15 添加 课 程信息 对话 框图 18-17 修改 课 程信息 对话 框图 18-19 查询 成 绩 信息 对话 框 图 18-20 关 于 SMIS版本 说 明 对话 框图 18-18 修改成 绩 信息 对话 框图 18-16 添加成 绩 信息 对话 框学生管理信息系统中还使用 SQL Server 2000 创建了若干数据库对象,如数据库关系图、
视图、查询、存储过程、触发器、规则等,以便于系统管理与程序开发。在此,鉴于篇幅仅介绍其中部分常用的内容。
1.创建关系图关系图是以图形方式显示通过数据连接选择的表或表结构化对象,并显示它们之间的联接关系。在本系统中也对相关表建立了彼此间的关系图,如图 18-21所示。
系 统 中各表 间 的 关 系图图 18-21 SMIS中 数 据表 间关 系 图对话 框
18-5 SQL Server 数 据 库对 象 设计
2.创建视图使用视图可对数据库中相关表实施 Select-From-Where语句查询,图 18-22所示的是视图设计器创建视图的过程(包含了关系图、设计表格,SQL语句和执行结果),该视图为建立了学籍信息表、成绩信息表和课程信息表间的关联性关系的视图 xsglo,它包括了关系数据库的选择、投影和连接三大运算。创建该视图的具体语句如下:
CREATE VIEW xsglo
AS
SELECT TOP 100 PERCENT dbo.student_Info.student_ID,
dbo.student_Info.student_Name,
dbo.student_Info.class_No,dbo.student_Info.tele_Number,dbo.student_Info.ru_Date,
dbo.student_Info.address,dbo.result_Info.exam_No,dbo.result_Info.course_Name
FROM dbo.course_Info INNER JOIN
dbo.student_Info INNER JOIN
dbo.result_Info ON dbo.student_Info.student_ID = dbo.result_Info.student_Id ON
dbo.course_Info.course_Name = dbo.result_Info.course_Name
WHERE dbo.student_Info.student_ID > '10'
ORDER BY dbo.student_Info.student_ID,dbo.student_Info.class_No
Go
图 18-23 SMIS 所 创 建的存 储过 程 对话 框图 18-22 基于 SMIS创 建的 视图 及 运 行 结 果 对话 框本系统中使用存储过程完成了对数据表进行查询的功能,建立了名为 xsglpro的存储过程,
图 18-23所示的是使用查询分析器和 T-SQL语句建立的名为 xsglpro存储过程。存储过程语句如下:
CREATE PROCEDURE xsglpro AS
SELECT TOP 100 PERCENT dbo.student_Info.student_ID,
dbo.student_Info.student_Name,
dbo.student_Info.class_No,dbo.student_Info.tele_Number,
dbo.student_Info.address,
dbo.result_Info.result,dbo.result_Info.course_Name,
dbo.result_Info.exam_No
FROM dbo.result_Info INNER JOIN
dbo.student_Info ON
dbo.result_Info.student_Id = dbo.student_Info.student_ID
WHERE (dbo.student_Info.student_ID > '10')
ORDER BY dbo.student_Info.student_ID DESC
3.创建存储过程存储过程可以使得对数据库的管理、显示数据库及其用户信息的工作变得容易。存储过程以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程可包含程序流、逻辑以及对数据库的查询。
本章介绍了 数据库的规划与设计和学生管理信息系统实例。
数据库设计是在一个给定的应用环境下,确定一个最优数据模型和处理模式,建立数据库及其应用系统,使之能够安全、有效、可靠地存储数据,满足各种用户的应用需求。
数据库设计的内容主要包括两个方面的内容:其一是结构设计,即设计数据库框架或数据库结构;其二为行为设计,也就是应用程序和事务处理等的设计。数据库设计过程主要包括需求分析、概念结构设计、逻辑结构设计、物理结构设计、
数据库实施、数据库运行和维护六个过程。
学生管理信息系统可用来管理学生信息与提高系统管理工作的效率。 SIMS把
Visual Basic(前台开发)与 SQL Server 2000(后台管理)有机地结合,并运用流行的 ADO等相关技术,完成学生信息的规范管理、科学统计和快速查询,从而可大大减少该管理上的工作量。
学生管理信息系统实例首先介绍了系统需求分析、主要任务、系统总体功能模块结构、系统数据流程、数据库概念结构设计、数据库逻辑结构设计、数据库物理结构设计、数据库的实现;其次,详细剖析了 SMIS应用程序的编制,包括创建主控窗体、创建公用模块、创建学籍信息输入窗体、修改学籍信息窗体、查询学籍信息窗体、系统设置类窗体、视图与存储过程的使用等。最后扼要浏览了:添加班级信息、修改班级信息、添加课程信息、添加成绩信息、修改课程信息、修改成绩信息、查询成绩信息等模块。
18-6 本章小结
1,试问数 据 库设计内 容主要包括 哪 些方面。
2,简 述 数 据 库设计 的整 个过 程,并简 要 画 出其 过 程 图 。
3,简 述 实 施 E-R方法的基本步 骤 。
4,简 述 数 据 库实 施的具体步 骤 。
5,试 述 逻辑结构设计 的具体任 务 。
6,简 述 SIMS的主要任 务 。
7,试问创 建 Module1公用模 块 有何益 处?
8,使用 Visual Basic/SQL Server 设计 一 个劳动 工 资 信息管理系 统,基本功能包括:
( 1) 职 工基本信息的添加,删 除、修改 与查询 。
( 2) 职 工工 资 信息的添加,删 除、修改 与查询 。
( 3) 职 工基本信息 与职 工工 资 信息的 统计 和具体 报 表。
习题十八