1.概述
1.1 项目背景
随着我国教育体制改革的深入进行,教育系统得到了前所未有的发展。学生管理正在逐步迈向管理信息现代化。但是我国的学生管理信息化水平还处在初级阶段,主要表现在对学生的学籍信息管理还是采用原有的人工管理方式。学校的规模不断扩大,学生数量急剧增加,有关学生的各种信息量也成倍增长。由于大学生类别和专业的设置的多样化,大学生的学籍管理历来是非常繁琐和复杂的的工作。面对庞大的信息量, 这时的人工管理几乎无法实现,在这种情况下用数据库进行管理变的尤为必要,这可以发挥计算机的优势来提高学生管理工作的效率。通过这样的系统,可以做到信息的规范管理,科学统计和快速的查询,从而减少管理方面的工作量和人为错误。
1.2 编写目的
学生学籍管理系统是应对学生人数增多、信息量增大的问题,实现管理的现代化、化,逐步摆脱当前学生成绩管理的人工管理方式,提高成绩管理效率而开发的。望该开发程序能够解决学生信息存储、学生各种信息查询等一系列功能。
1.3 软件定义
学生信息管理系统是针对学校人事处的大量业务处理工作而开发的管理软件,主要用于学校学生信息管理,总体任务是实现学生信息关系的系统化、科学化、规范化和自动化,其主要任务是用计算机对学生各种信息进行日常管理,如查询、修改、增加、删除,另外还考虑到学生选课,针对这些要求设计了学生信息管理系统。
1.4 开发环境
开发环境:Windows XP、VC6.0
辅助工具:PowerDesigner 15
数据库管理系统:SQL Server 2000
运行环境:Windows 2000/XP/2003
2.需求分析
2.1 问题陈述
进行数据库设计首先必须准确了解用户需求,目的是为学籍管理数据库系统的设计打下牢牢的基础,是数据库开发的重要文件依据,主要为数据库设计人员使用,是用户和系统分析员的项目依据文件。需求分析是否做得充分与准确,它决定了在其上构建数据库大厦的速度和质量。
2.2 系统主要功能
(1)学生档案的管理,即录入、修改、查询、输出学生档案信息,这些信息包括学生基本情况、学生简历情况、学生奖励情况、学生处分情况、学生家庭信息、学生体检情况。
(2)学生学籍管理,录入、修改、查询、输出学生学籍信息,这些信息包括学生奖贷学金情况、学生注册、学生异动情况、学生军训情况、学生毕业情况。
(3)学生成绩管理,录入修改、查询、输出学生入校成绩,各学期、各门课程的成绩信息,并支持按年级、班级等条件的统计、查询、报表输出。
简要分析:
(1)学生简历情况和学生基本情况可以合为一张学生信息表
(2)学生奖励情况和处分情况可以合为一张表,增加一项用于表示“奖励”或“处罚”
(3)学生军训情况可以作为一门课程,放入课程表中,无需单独设一张表
(4)学生毕业信息可以在学生表中增加一项简单表示,无需单设一张表
经过分析,为了表示要求的信息,本学生学籍信息管理系统可以抽象出8个主要实体:学生、奖励或处罚、家庭、体检、贷款、注册、异动、课程。
3. 数据库概念结构设计
3.1 系统E-R图
下面是用PowerDesingner 15 设计出的系统CDM图,既概念模型图:
下面是用PowerDesingner 15 从CDM图直接导出的PDM图,即物理结构图:
4. 数据库逻辑结构设计
逻辑结构设计就是把概念结构设计阶段设计好的基本E-R图转换为与选用DBMS产品所支持的数据模型相符合的逻辑结构。
4.1 关系表
通过上一步画出的E-R图即可得到对应的关系表,我们采用PowerDesigner直接得出对应的PDM图,双击PDM图中某个实体,在Preview中可以得到对应的Sql语句,在Sql Server 2000中打开查询分析器即可用相应的Sql语句即可得到初步的关系表。
学生基本信息表(Student)
序号 |
字段 |
描述 |
数据类型 |
数据长度 |
码 |
1 |
StuNo |
学号 |
char |
20 |
Y |
2 |
StuName |
姓名 |
char |
20 |
N |
3 |
StuSex |
性别 |
char |
2 |
N |
4 |
StuBirthTime |
出生日期 |
Date |
|
N |
5 |
StuProvince |
籍贯 |
char |
10 |
N |
6 |
StuNation |
民族 |
char |
10 |
N |
7 |
StuFace |
政治面貌 |
char |
20 |
N |
8 |
StuFromWhere |
来源地区 |
char |
30 |
N |
9 |
StuBirthPlace |
出生地 |
char |
30 |
N |
10 |
StuCollege |
学院 |
char |
20 |
N |
11 |
StuMajor |
专业 |
char |
30 |
N |
12 |
StuClass |
行政班级 |
char |
30 |
N |
13 |
StuStudyTime |
学制 |
Short int |
2 |
N |
14 |
StuSchoolTime |
入学时间 |
Date |
8 |
N |
15 |
StuCurrentClass |
当前年级 |
int |
4 |
N |
16 |
StuDormitory |
宿舍 |
char |
20 |
N |
17 |
StuEMail |
邮件地址 |
char |
30 |
N |
18 |
StuPhone |
联系电话 |
char |
20 |
N |
19 |
StuPost |
邮编 |
char |
10 |
N |
20 |
StuID |
身份证号 |
char |
25 |
N |
21 |
StuIsGraduate |
是否毕业 |
char |
2 |
N |
22 |
StuGraduateDate |
毕业日期 |
Date |
8 |
N |
学生注册信息表(StuRegister)
序号 |
字段 |
描述 |
数据类型 |
数据长度 |
码 |
1 |
StuRegisterID |
注册编号 |
char |
20 |
Y |
2 |
StuNo |
学号 |
char |
20 |
N |
3 |
StuRegisterYear |
注册学年 |
char |
10 |
N |
4 |
StuRegisterTerm |
注册学期 |
char |
1 |
N |
5 |
StuIsRegister |
是否注册 |
char |
2 |
N |
学生异动信息表(StuChange)
序号 |
字段 |
描述 |
数据类型 |
数据长度 |
码 |
1 |
StuChangeID |
异动编号 |
char |
10 |
Y |
2 |
StuNo |
学号 |
char |
20 |
N |
3 |
StuChangeKind |
异动类型 |
char |
10 |
N |
4 |
StuChangeDate |
异动时间 |
Date |
|
N |
5 |
StuChangeDetail |
异动描述 |
char |
60 |
N |
学生贷款信息表(StuLoan)
序号 |
字段 |
描述 |
数据类型 |
数据长度 |
码 |
1 |
StuLoanID |
贷款编号 |
char |
20 |
Y |
2 |
StuNo |
学号 |
char |
20 |
N |
3 |
StuLoanDate |
贷款日期 |
Date |
|
N |
4 |
StuLoanR |
贷款原因 |
char |
60 |
N |
5 |
StuLoanNum |
贷款数目 |
int |
|
N |
6 |
StuLoanBackNum |
已还数目 |
int |
|
|
7 |
StuLoanIsBack |
是否还清 |
char |
2 |
|
学生奖励或处罚信息表(StuRewardPunish)
序号 |
字段 |
描述 |
数据类型 |
数据长度 |
码 |
1 |
StuLoanID |
奖励或处罚编号 |
char |
20 |
Y |
2 |
StuNo |
学号 |
char |
20 |
N |
3 |
StuNo |
奖励或处罚类型 |
char |
30 |
N |
4 |
StuLoanDate |
奖励或处罚日期 |
Date |
|
N |
5 |
StuLoanR |
奖励或处罚原因 |
char |
60 |
N |
6 |
StuLoanNum |
奖励或处罚标记 |
char |
4 |
N |
学生课程信息表(StuCourse)
序号 |
字段 |
描述 |
数据类型 |
数据长度 |
码 |
1 |
StuCourseNo |
课程编号 |
char |
20 |
Y |
2 |
StuNo |
学号 |
char |
20 |
Y |
3 |
StuCourseYear |
开课学年 |
char |
10 |
N |
4 |
StuCourseTerm |
开课学期 |
char |
1 |
N |
5 |
StuCourseName |
课程名 |
char |
40 |
N |
6 |
StuCourseScore |
课程分数 |
int |
|
N |
7 |
StuCourseCredit |
课程学分 |
float |
|
N |
8 |
StuCourseJiDian |
课程绩点 |
float |
|
N |
9 |
StuCourseKind |
课程性质 |
char |
10 |
N |
10 |
StuReStudyFlag |
重修标记 |
char |
2 |
N |
11 |
StuReStudyScore |
重修成绩 |
Int |
|
N |
12 |
StuReTestFlag |
补考标记 |
char |
2 |
N |
13 |
StuReTestScore |
补考成绩 |
int |
|
N |
14 |
StuCourseGS |
课程归属 |
char |
30 |
N |
15 |
StuFXFlag |
辅修标记 |
char |
2 |
N |
学生家庭信息表(StuFamily)
序号 |
字段 |
描述 |
数据类型 |
数据长度 |
码 |
1 |
StuFamilyID |
家庭编号 |
char |
20 |
Y |
2 |
StuNo |
学号 |
char |
20 |
N |
3 |
StuFamilyAddress |
家庭地址 |
char |
40 |
N |
4 |
StuFatherName |
父亲姓名 |
char |
20 |
N |
5 |
StuFatherWP |
父亲工作单位 |
char |
40 |
N |
6 |
StuFatherWPPost |
父亲单位邮编 |
char |
10 |
N |
7 |
StuFatherPhone |
父亲电话 |
char |
20 |
N |
8 |
StuMotherName |
母亲姓名 |
char |
20 |
N |
9 |
StuMotherWP |
母亲工作单位 |
char |
40 |
N |
10 |
StuMotherWPPost |
母亲单位邮编 |
char |
10 |
N |
11 |
StuMotherPhone |
母亲电话 |
char |
20 |
N |
学生体检信息表(StudentHealthCheck)
序号 |
字段 |
描述 |
数据类型 |
数据长度 |
码 |
1 |
StuCheckID |
体检编号 |
char |
20 |
Y |
2 |
StuNo |
学号 |
char |
20 |
N |
3 |
StuCheckYear |
体检学年 |
char |
10 |
N |
4 |
StuCheckTerm |
体检学期 |
char |
1 |
N |
5 |
StuHeight |
身高 |
int |
|
N |
6 |
StuWeight |
体重 |
float |
|
N |
7 |
StuEye |
视力 |
float |
|
N |
8 |
StuLungC |
肺活量 |
int |
|
N |
9 |
StuBloodP |
血压 |
int |
|
N |
10 |
StuLiver |
肝功能 |
char |
20 |
N |
11 |
StuBlood |
血常规 |
char |
40 |
N |
12 |
StuHeartLung |
心肺功能 |
char |
20 |
N |
13 |
StuDiseaseItem |
异常项目 |
char |
40 |
N |
14 |
CheckConclusion |
体检结果 |
char |
40 |
N |
4.2 定义视图
在设计表时,考虑到数据冗余,本系统只保留“学号”作为表间的连接。为了方便用户使用,可以把这些详细的信息用视图来表示,并且不会产生冗余,从而方便了用户的查询;由于本系统信息对管理员和学生都不是什么保密信息,所以无需考虑系统安全性而为不同级别用户再定义相应的视图;此外,为了符合用户习惯,我们在视图中使用中文别名。
(1)学生基本信息视图:
USE Student
GO
CREATE VIEW StudentInfo
AS
SELECT StuNo 学号,StuName 姓名,StuSex 性别,StuBirthTime 出生日期,
StuProvince 籍贯,StuNation 民族,StuFace 政治面貌,
StuFromWhere 来源地区,StuBirthPlace 出生地,StuCollege 学院,
StuMajor 专业,StuClass 行政班级,StuStudyTime 学制,
StuSchoolTime 入学时间,StuCurrentClass 当前所在年级,
StuDormitory 宿舍,StuEMail 电子邮件,StuPhone 联系电话,
StuPost 邮编,StuID 身份证号,StuIsGraduate 是否毕业,
StuGraduateDate 毕业日期
FROM student
(2)学生异动信息视图:
USE Student
GO
CREATE VIEW StuChangeInfo
AS
SELECT StuChangeID 异动记录号,StuChange.StuNo 学号,StuName 姓名,
StuCollege 学院,StuClass 班级,StuMajor 专业,StuChangeKind
异动类型,StuChangeDate 异动日期,StuChangeDetail 异动详细描述
FROM Student,StuChange
where Student.StuNo=StuChange.StuNo
(3)学生课程信息视图:
USE Student
GO
CREATE VIEW StuCourseInfo
AS
SELECT StuCourseNo 课程编号,StuCourse.StuNo 学号,StuName 姓名,
StuCollege 学院,StuClass 班级,StuMajor 专业,
StuCourseYear 学年,StuCourseTerm 学期,
StuCourseName 课程名,StuCourseScore 分数,
StuCredit 已获学分,StuCourseJiDian 已获绩点,
StuCourseKind 课程性质,StuReStudyFlag 重修标记,
StuReStudyScore 重修分数,StuReTestFlag 补考标记,
StuReTestScore 补考分数,StuCourseGS 课程归属,
StuFXFlag 辅修标记
FROM Student,StuCourse
where Student.StuNo=StuCourse.StuNo
(4)学生体检信息视图:
USE Student
GO
CREATE VIEW StuHealthCheckInfo
AS
SELECT StuCheckID 体检编号,Student.StuNo 学号,StuName 姓名,
StuSex 性别,StuCollege 学院,StuClass 班级,StuMajor 专业,
StuPhone 联系电话,StuCheckYear 体检学年,StuCheckTerm
体检学期,StuHeight 身高,StuWeight 体重,StuEye 视力,
StuLungC 肺活量,StuBloodP 血压,StuLiver 肝功能,
StuBlood 血常规,StuHeartLung 心肺功能,StuDiseaseItem
异常项目,CheckConclusion 体检结果
FROM Student,StudentHealthCheck
where Student.StuNo=StudentHealthCheck.StuNo
(5)学生家庭信息视图:
USE Student
GO
CREATE VIEW StuFamilyInfo
AS
SELECT StuFamilyID 家庭编号,Student.StuNo 学号,StuName 姓名,
StuCollege 学院,StuClass 班级,StuMajor 专业,
StuFamilyAddress 家庭地址,StuFatherName 父亲姓名,
StuFatherWP 父亲工作单位,StuFatherWPPost 父亲单位邮编,
StuFatherPhone 父亲电话,StuMotherName 母亲姓名,
StuMotherWP 母亲工作单位,StuMotherWPPost 母亲单位邮编,
StuMotherPhone 母亲电话
FROM Student,StuFamily
where Student.StuNo=StuFamily.StuNo
(6)学生贷款信息视图:
USE Student
GO
CREATE VIEW StuLoanInfo
AS
SELECT StuLoanID 贷款编号,Student.StuNo 学号,StuName 姓名,
StuCollege 学院,StuClass 班级,StuMajor 专业,
StuLoanDate 贷款日期,StuLoanR 贷款原因,
StuLoanNum 贷款数目,StuLoanBackNum 已还贷款数目,
StuLoanIsBack 是否还清
FROM Student,StuLoan
where Student.StuNo=StuLoan.StuNo
(7)学生注册信息视图:
USE Student
GO
CREATE VIEW StuRegisterInfo
AS
SELECT StuRegisterID 注册编号,Student.StuNo 学号,StuName 姓名,
StuCollege 学院,StuClass 班级,StuMajor 专业,
StuCurrentClass 当前所在年级,StuRegisterYear 注册学年,
StuRegisterTerm 注册学期,StuIsRegister 是否注册
FROM Student,StuRegister
where Student.StuNo=StuRegister.StuNo
(8)学生奖励或处罚视图:
USE Student
GO
CREATE VIEW StuRewardPunishInfo
AS
SELECT StuRPID 奖励或处罚记录号,Student.StuNo 学号,StuName 姓名,
StuCollege 学院,StuClass 班级,StuMajor 专业,StuFace
政治面貌,StuRPKind 奖励或处罚类型,StuRPDate 奖励或处罚日期,
StuRPR 奖励或处罚原因,StuRP 奖励或处罚标记
FROM Student,StuRewardPunish
where Student.StuNo=StuRewardPunish.StuNo
4.3 定义索引
(1)所有表中的主键自动被设为索引项
(2)由于属性“学号”经常在连接操作中出现,所以在每张表中建立“学号”的索引
(3)课程表中的“分数”经常作为最大最小值被查询,可以建立相应索引
create index StuCourseScoreIndex on StuCourse(StuCourseScore)
4.4 定义权限
(1)当前用户为dbo,是系统管理员,可以通过sql语句赋予dbo对数据库Student中
表student的所有特权,不过这是默认的,例如:
grant all privileges
on Student
to dbo
with grant option
(2)先在管理器中建立一个登录用户,再在Student数据库中建立一个用户sh,假设他
是一名学生,则可以赋予他对所有表的select权限。
grant select on StuChange to sh;
grant select on StuCourse to sh;
grant select on Student to sh;
grant select on StudentHealthCheck to sh;
grant select on StuFamily to sh;
grant select on StuLoan to sh;
grant select on StuRegister to sh;
grant select on StuRewardPunish to sh;
4.5 定义触发器
各表之间只用“学号”作为连接,并已经用管理器建立了关系,无需再建立“学号”上的触发器,即无论在哪里修改“学号”,都会因为这种主键与外键的关系而失败,学生表中的“学号”总是与其他表中的“学号”保持一致的。
(1)课程表StuCourse
表中的重修、补考标记可能会与重修分数、补考分数不一致,即重修标记为“否”,
但分数却有值,这是check约束无法约束的;同时,如果分数>=60,则重修和补考
标记都应为“否”。
CREATE trigger CourseReStudyTestFlag
on StuCourse
after insert,update
as
if exists(select StuNo,StuCourseNo from StuCourse where
StuReStudyFlag='否' or StuReTestFlag='否' or StuCourseScore>=60)
begin
update StuCourse set StuReStudyScore=null
where StuReStudyFlag='否'
update StuCourse set StuReTestScore=null
where StuReTestFlag='否'
update StuCourse set StuReTestFlag='否'
where StuCourseScore>=60
update StuCourse set StuReStudyFlag='否'
where StuCourseScore>=60
end
(2)学生表Student
如果学生没有毕业,“毕业日期”一项应为空
CREATE trigger StuGraduate
on Student
for insert,update
as
if exists (select StuNo from Student where StuIsGraduate='否' )
begin
update Student set StuGraduateDate=null
where StuIsGraduate='否'
End
(3)学生贷款表StuLoan
如果已还贷款数目=贷款数目,“是否还清”一项应为“是”
create trigger StuLoanBack
on StuLoan
for insert,update
as
if (select StuLoanBackNum from StuLoan)=
(select StuLoanNum from StuLoan)
begin
update StuLoan set StuLoanIsBack='是'
End
4.6 定义存储过程
(1)查询学生档案信息,包括学生基本情况、学生奖励情况、学生处分情况、学生家庭信息、学生体检情况。
create procedure SelectDangAn
(@xuehao char(20))
As
Begin
select *
from Student,StuRewardPunish,StuFamily,StudentHealthCheck
where Student.StuNo=StuRewardPunish.StuNo and
StuRewardPunish.StuNo=StuFamily.StuNo and
StuFamily.StuNo=StudentHealthCheck.StuNo and
StudentHealthCheck.StuNo=@xuehao
End
Go
exec SelectDangAn @xuehao='20091602310073'
(2)查询学生学籍信息,包括学生贷款情况、学生注册情况、学生异动情况、学生毕业情况。
create procedure SelectXueJi
(@xuehao char(20))
as
begin
select *
from Student,StuLoan,StuRegister,StuChange
where Student.StuNo=StuLoan.StuNo and
StuLoan.StuNo=StuRegister.StuNo and
StuRegister.StuNo=StuChange.StuNo and
StuChange.StuNo=@xuehao
end
go
exec SelectXueJi @xuehao='20091602310073'
(3)查询学生各门课成绩,支持按年级和班级条件查询。
create procedure SelectChengJi1
(@xuehao char(20))
as
begin
select *
from Student,StuCourse
where Student.StuNo=StuCourse.StuNo and
StuCourse.StuNo=@xuehao
end
go
exec SelectChengJi @xuehao='20091602310073'
create procedure SelectChengJi2
(@class char(30))
as
begin
select *
from Student,StuCourse
where Student.StuNo=StuCourse.StuNo and
Student.StuClass=@class
end
go
exec SelectChengJi2 @class='计算机科学与技术0903班'
5. 数据流图及程序结构框图
数据流图:
顶级数据流图:
一级数据流图:
二级数据流图:
程序结构框图:
6. 程序源代码及其说明
(1)引入ADO组件类型库,初始化组件
直接在Stdafx.h文件中加入下面语句来实现引入:
#import "C:\Program Files\Common Files\System\ado\msado15.dll"no_namespace rename("EOF","adoEOF")
语句no_namespace说明ADO对象不使用命名空间,rename ("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。
建立工作区Student,在CStudentApp类中的InitInstance()中初始化COM,如下:
CoInitialize(NULL);
在类CStudentApp中新建虚函数virtual int ExitInstance()用于关闭COM,如下:
int CStudentApp::ExitInstance()
{
CoUninitialize();
return CWinApp::ExitInstance();
}
接着就可以直接使用Ado提供的指针m_pConnection,m_pRecordset操作数据库了
(2)初始化界面
学生管理信息系统的程序结构中主要有三大组成部分:档案管理、学籍管理、成绩管
理,其中每个模块都要实现相同的功能:录入、修改、查询、删除、输出,而“用户
管理”模块可以忽略,故主要选择其中“档案管理”的“学生基本信息管理”来介绍
代码部分。
主界面——学生档案管理界面:
学生基本信息界面:
说明:在主界面中,可以看到学生的整体档案信息,但必须是基本信息、奖励或处罚信息、家庭信息、体检信息都有才能显示;通过主界面的下面四个按钮可以将学生档案信息分开管理。
先在“学生基本信息”类中添加如下代码:
_RecordsetPtr m_pRecordset; //创建记录集对象
_ConnectionPtr m_pConnection;
初始化“学生基本信息”界面中List控件函数Refresh()如下:
1 void CStuBasicInfo::Refresh() 2 { 3 //连接数据库,ADO方法 4 //假设m_pConnection是我们已经建立好的连接,我们使用_RecordsetPtr接口的Open方法打开表的记录集 5 6 _variant_t value; 7 CString da; 8 da="select * from StudentInfo"; 9 try 10 { 11 CoInitialize(NULL); 12 m_pConnection.CreateInstance(_uuidof(Connection)); 13 m_pRecordset.CreateInstance(_uuidof(Recordset)); 14 15 m_pConnection->Open((_bstr_t)scon,"","",adModeUnknown); 16 m_pRecordset->Open((_bstr_t)da,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); 17 } 18 catch (_com_error e) 19 { 20 MessageBox(e.ErrorMessage()); 21 } 22 23 //在list控件中初始化档案信息 24 try 25 { 26 if(!m_pRecordset->BOF) 27 m_pRecordset->MoveFirst();//记录指针移到第一行(第一条记录) 28 else 29 { 30 AfxMessageBox("数据库中没有数据!"); 31 return ; 32 } 33 34 int count=0;//记录列数 35 36 //在listctrl中添加数据 37 //如果没有遇到表结束标志adoEOF,则用GetCollect(字段名)来获取当前记录 38 //指针所指的字段值,然后再用MoveNext()方法移动到下一条记录位置 39 while(!m_pRecordset->adoEOF) 40 { 41 value = m_pRecordset->GetCollect("学号"); 42 m_list.InsertItem(count,(LPCSTR)(_bstr_t)value); 43 44 value = m_pRecordset->GetCollect("姓名"); 45 m_list.SetItemText(count,1,(LPCSTR)(_bstr_t)value); 46 47 value = m_pRecordset->GetCollect("性别"); 48 m_list.SetItemText(count,2,(LPCSTR)(_bstr_t)value); 49 50 value = m_pRecordset->GetCollect("出生日期"); 51 m_list.SetItemText(count,3,(LPCSTR)(_bstr_t)value); 52 53 value = m_pRecordset->GetCollect("籍贯"); 54 m_list.SetItemText(count,4,(LPCSTR)(_bstr_t)value); 55 56 value = m_pRecordset->GetCollect("民族"); 57 m_list.SetItemText(count,5,(LPCSTR)(_bstr_t)value); 58 59 value = m_pRecordset->GetCollect("政治面貌"); 60 m_list.SetItemText(count,6,(LPCSTR)(_bstr_t)value); 61 62 value = m_pRecordset->GetCollect("来源地区"); 63 m_list.SetItemText(count,7,(LPCSTR)(_bstr_t)value); 64 65 value = m_pRecordset->GetCollect("出生地"); 66 m_list.SetItemText(count,8,(LPCSTR)(_bstr_t)value); 67 68 value = m_pRecordset->GetCollect("学院"); 69 m_list.SetItemText(count,9,(LPCSTR)(_bstr_t)value); 70 71 value = m_pRecordset->GetCollect("专业"); 72 m_list.SetItemText(count,10,(LPCSTR)(_bstr_t)value); 73 74 value = m_pRecordset->GetCollect("行政班级"); 75 m_list.SetItemText(count,11,(LPCSTR)(_bstr_t)value); 76 77 value = m_pRecordset->GetCollect("学制"); 78 m_list.SetItemText(count,12,(LPCSTR)(_bstr_t)value); 79 80 value = m_pRecordset->GetCollect("入学时间"); 81 m_list.SetItemText(count,13,(LPCSTR)(_bstr_t)value); 82 83 value = m_pRecordset->GetCollect("当前年级"); 84 m_list.SetItemText(count,14,(LPCSTR)(_bstr_t)value); 85 86 value = m_pRecordset->GetCollect("宿舍"); 87 m_list.SetItemText(count,15,(LPCSTR)(_bstr_t)value); 88 89 value = m_pRecordset->GetCollect("电子邮件"); 90 if(value.vt==VT_NULL) 91 m_list.SetItemText(count,16,""); 92 else 93 m_list.SetItemText(count,16,(LPCSTR)(_bstr_t)value); 94 95 value = m_pRecordset->GetCollect("联系电话"); 96 if(value.vt==VT_NULL) 97 m_list.SetItemText(count,17,""); 98 else 99 m_list.SetItemText(count,17,(LPCSTR)(_bstr_t)value); 100 101 value = m_pRecordset->GetCollect("邮编"); 102 if(value.vt==VT_NULL) 103 m_list.SetItemText(count,18,""); 104 else 105 m_list.SetItemText(count,18,(LPCSTR)(_bstr_t)value); 106 107 value = m_pRecordset->GetCollect("身份证号"); 108 m_list.SetItemText(count,19,(LPCSTR)(_bstr_t)value); 109 110 value = m_pRecordset->GetCollect("是否毕业"); 111 m_list.SetItemText(count,20,(LPCSTR)(_bstr_t)value); 112 113 value = m_pRecordset->GetCollect("毕业日期"); 114 if(value.vt==VT_NULL) 115 m_list.SetItemText(count,21,""); 116 else 117 m_list.SetItemText(count,21,(LPCSTR)(_bstr_t)value); 118 119 count++; 120 m_pRecordset->MoveNext(); 121 } 122 } 123 catch (_com_error e) 124 { 125 AfxMessageBox(e.ErrorMessage()); 126 } 127 128 }
(3)添加新纪录
1 void CStuBasicInfo::OnBUTTONAdd() 2 { 3 // TODO: Add your control notification handler code here 4 5 //连接数据库,ADO方法 6 //假设m_pConnection是我们已经建立好的连接,我们使用_RecordsetPtr接口的Open方法打开表的记录集 7 8 _variant_t value; 9 CString da; 10 da="select * from StudentInfo"; 11 try 12 { 13 CoInitialize(NULL); 14 m_pConnection.CreateInstance(_uuidof(Connection)); 15 m_pRecordset.CreateInstance(_uuidof(Recordset)); 16 17 m_pConnection->Open((_bstr_t)scon,"","",adModeUnknown); 18 m_pRecordset->Open((_bstr_t)da,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); 19 } 20 catch (_com_error e) 21 { 22 MessageBox(e.ErrorMessage()); 23 } 24 25 //写入数据 26 try 27 { 28 UpdateData(true); 29 m_pRecordset->MoveLast(); 30 m_pRecordset->AddNew(); 31 32 _variant_t b; 33 b.vt=NULL;//空指针,用于向数据库中插入 34 35 m_pRecordset->PutCollect("学号",(_variant_t)m_1); 36 m_pRecordset->PutCollect("姓名",(_variant_t)m_2); 37 m_pRecordset->PutCollect("性别",(_variant_t)m_3); 38 m_pRecordset->PutCollect("出生日期",(_variant_t)m_4); 39 m_pRecordset->PutCollect("籍贯",(_variant_t)m_5); 40 m_pRecordset->PutCollect("民族",(_variant_t)m_6); 41 m_pRecordset->PutCollect("政治面貌",(_variant_t)m_7); 42 m_pRecordset->PutCollect("来源地区",(_variant_t)m_8); 43 m_pRecordset->PutCollect("出生地",(_variant_t)m_9); 44 m_pRecordset->PutCollect("学院",(_variant_t)m_10); 45 m_pRecordset->PutCollect("专业",(_variant_t)m_11); 46 m_pRecordset->PutCollect("行政班级",(_variant_t)m_12); 47 m_pRecordset->PutCollect("学制",(_variant_t)m_13); 48 m_pRecordset->PutCollect("入学时间",(_variant_t)m_14); 49 m_pRecordset->PutCollect("当前年级",(_variant_t)m_15); 50 m_pRecordset->PutCollect("宿舍",(_variant_t)m_16); 51 52 if(m_17 == "") 53 m_pRecordset->PutCollect("电子邮件",b); 54 else 55 m_pRecordset->PutCollect("电子邮件",(_variant_t)m_17); 56 57 if(m_18 == "") 58 m_pRecordset->PutCollect("联系电话",b); 59 else 60 m_pRecordset->PutCollect("联系电话",(_variant_t)m_18); 61 62 if(m_19 == "") 63 m_pRecordset->PutCollect("邮编",b); 64 else 65 m_pRecordset->PutCollect("邮编",(_variant_t)m_19); 66 67 m_pRecordset->PutCollect("身份证号",(_variant_t)m_20); 68 m_pRecordset->PutCollect("是否毕业",(_variant_t)m_21); 69 70 if(m_22 == "") 71 m_pRecordset->PutCollect("毕业日期",b); 72 else 73 m_pRecordset->PutCollect("毕业日期",(_variant_t)m_22); 74 75 76 m_pRecordset->Update(); 77 78 79 } 80 catch (_com_error e) 81 { 82 AfxMessageBox(e.ErrorMessage()); 83 } 84 m_list.DeleteAllItems(); 85 Refresh(); 86 87 88 }
(4)修改记录部分
1 int selRow; 2 void CStuBasicInfo::OnBUTTONModify() 3 { 4 // TODO: Add your control notification handler code here 5 6 int nItemSelected=m_list.GetSelectedCount();//所选表项数 7 if(nItemSelected<1) 8 { 9 MessageBox("请先选择你要修改的项目"); 10 return; 11 } 12 if(nItemSelected>1) 13 { 14 MessageBox("只能同时修改一项"); 15 return; 16 } 17 selRow = m_list.GetNextItem(-1,LVNI_ALL|LVNI_SELECTED);//当前选取行号 18 19 m_1 = m_list.GetItemText(selRow,0); 20 m_2 = m_list.GetItemText(selRow,1); 21 m_3 = m_list.GetItemText(selRow,2); 22 m_4 = m_list.GetItemText(selRow,3); 23 m_5 = m_list.GetItemText(selRow,4); 24 m_6 = m_list.GetItemText(selRow,5); 25 m_7 = m_list.GetItemText(selRow,6); 26 m_8 = m_list.GetItemText(selRow,7); 27 m_9 = m_list.GetItemText(selRow,8); 28 m_10 = m_list.GetItemText(selRow,9); 29 m_11 = m_list.GetItemText(selRow,10); 30 m_12 = m_list.GetItemText(selRow,11); 31 m_13 = m_list.GetItemText(selRow,12); 32 m_14 = m_list.GetItemText(selRow,13); 33 m_15 = m_list.GetItemText(selRow,14); 34 m_16 = m_list.GetItemText(selRow,15); 35 m_17 = m_list.GetItemText(selRow,16); 36 m_18 = m_list.GetItemText(selRow,17); 37 m_19 = m_list.GetItemText(selRow,18); 38 m_20 = m_list.GetItemText(selRow,19); 39 m_21 = m_list.GetItemText(selRow,20); 40 m_22 = m_list.GetItemText(selRow,21); 41 42 UpdateData(false); 43 44 m_modifyOK.EnableWindow(true); 45 46 47 } 48 49 void CStuBasicInfo::OnBUTTONModifyOK() 50 { 51 // TODO: Add your control notification handler code here 52 53 // TODO: Add your control notification handler code here 54 //连接数据库,ADO方法 55 //假设m_pConnection是我们已经建立好的连接,我们使用_RecordsetPtr接口的Open方法打开表的记录集 56 57 _variant_t value; 58 CString da; 59 da="select * from StudentInfo"; 60 try 61 { 62 CoInitialize(NULL); 63 m_pConnection.CreateInstance(_uuidof(Connection)); 64 m_pRecordset.CreateInstance(_uuidof(Recordset)); 65 66 m_pConnection->Open((_bstr_t)scon,"","",adModeUnknown); 67 m_pRecordset->Open((_bstr_t)da,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); 68 } 69 catch (_com_error e) 70 { 71 MessageBox(e.ErrorMessage()); 72 } 73 74 75 //写入数据 76 try 77 { 78 UpdateData(true); 79 m_pRecordset->Move(selRow); 80 81 _variant_t b; 82 b.vt=NULL;//空指针,用于向数据库中插入 83 84 m_pRecordset->PutCollect("学号",(_variant_t)m_1); 85 m_pRecordset->PutCollect("姓名",(_variant_t)m_2); 86 m_pRecordset->PutCollect("性别",(_variant_t)m_3); 87 m_pRecordset->PutCollect("出生日期",(_variant_t)m_4); 88 m_pRecordset->PutCollect("籍贯",(_variant_t)m_5); 89 m_pRecordset->PutCollect("民族",(_variant_t)m_6); 90 m_pRecordset->PutCollect("政治面貌",(_variant_t)m_7); 91 m_pRecordset->PutCollect("来源地区",(_variant_t)m_8); 92 m_pRecordset->PutCollect("出生地",(_variant_t)m_9); 93 m_pRecordset->PutCollect("学院",(_variant_t)m_10); 94 m_pRecordset->PutCollect("专业",(_variant_t)m_11); 95 m_pRecordset->PutCollect("行政班级",(_variant_t)m_12); 96 m_pRecordset->PutCollect("学制",(_variant_t)m_13); 97 m_pRecordset->PutCollect("入学时间",(_variant_t)m_14); 98 m_pRecordset->PutCollect("当前年级",(_variant_t)m_15); 99 m_pRecordset->PutCollect("宿舍",(_variant_t)m_16); 100 101 if(m_17 == "") 102 m_pRecordset->PutCollect("电子邮件",b); 103 else 104 m_pRecordset->PutCollect("电子邮件",(_variant_t)m_17); 105 106 if(m_18 == "") 107 m_pRecordset->PutCollect("联系电话",b); 108 else 109 m_pRecordset->PutCollect("联系电话",(_variant_t)m_18); 110 111 if(m_19 == "") 112 m_pRecordset->PutCollect("邮编",b); 113 else 114 m_pRecordset->PutCollect("邮编",(_variant_t)m_19); 115 116 m_pRecordset->PutCollect("身份证号",(_variant_t)m_20); 117 m_pRecordset->PutCollect("是否毕业",(_variant_t)m_21); 118 119 if(m_22 == "") 120 m_pRecordset->PutCollect("毕业日期",b); 121 else 122 m_pRecordset->PutCollect("毕业日期",(_variant_t)m_22); 123 124 125 m_pRecordset->Update(); 126 127 128 } 129 catch (_com_error e) 130 { 131 AfxMessageBox(e.ErrorMessage()); 132 } 133 134 m_list.DeleteAllItems(); 135 Refresh(); 136 OnBUTTONClear(); 137 m_modifyOK.EnableWindow(false); 138 139 140 }
(5)删除部分
1 void CStuBasicInfo::OnBUTTONDel() 2 { 3 // TODO: Add your control notification handler code here 4 //连接数据库,ADO方法 5 //假设m_pConnection是我们已经建立好的连接,我们使用_RecordsetPtr接口的Open方法打开表的记录集 6 7 _variant_t value; 8 CString da; 9 da="select * from StudentInfo"; 10 try 11 { 12 CoInitialize(NULL); 13 m_pConnection.CreateInstance(_uuidof(Connection)); 14 m_pRecordset.CreateInstance(_uuidof(Recordset)); 15 16 m_pConnection->Open((_bstr_t)scon,"","",adModeUnknown); 17 m_pRecordset->Open((_bstr_t)da,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); 18 } 19 catch (_com_error e) 20 { 21 MessageBox(e.ErrorMessage()); 22 } 23 24 25 int i,iState; 26 int nItemSelected=m_list.GetSelectedCount();//所选表项数 27 int nItemCount=m_list.GetItemCount();//表项总数 28 29 if(nItemSelected<1) 30 return; 31 for(i=nItemCount-1;i>=0;i--) 32 { 33 iState=m_list.GetItemState(i,LVIS_SELECTED); 34 if(iState!=0) 35 { 36 try 37 { 38 m_pRecordset->Move(i); 39 m_pRecordset->Delete(adAffectCurrent); 40 m_pRecordset->Update(); 41 } 42 catch(_com_error *e) 43 { 44 AfxMessageBox(e->ErrorMessage()); 45 } 46 47 } 48 49 } 50 m_list.DeleteAllItems(); 51 Refresh(); 52 53 54 }
(6)查询部分
1 void CStuBasicInfo::OnBUTTONSearch() 2 { 3 // TODO: Add your control notification handler code here 4 5 UpdateData(true); 6 if(m_1=="") 7 { 8 MessageBox("请输入学号进行查询"); 9 return; 10 } 11 else 12 { 13 int nn=m_list.GetItemCount(); 14 CString str; 15 for(int i=0;i) 16 { 17 str=m_list.GetItemText(i,0); 18 str.Replace(" ",""); 19 m_1.Replace(" ",""); 20 if(m_1==str) 21 { 22 m_1 = m_list.GetItemText(i,0); 23 m_2 = m_list.GetItemText(i,1); 24 m_3 = m_list.GetItemText(i,2); 25 m_4 = m_list.GetItemText(i,3); 26 m_5 = m_list.GetItemText(i,4); 27 m_6 = m_list.GetItemText(i,5); 28 m_7 = m_list.GetItemText(i,6); 29 m_8 = m_list.GetItemText(i,7); 30 m_9 = m_list.GetItemText(i,8); 31 m_10 = m_list.GetItemText(i,9); 32 m_11 = m_list.GetItemText(i,10); 33 m_12 = m_list.GetItemText(i,11); 34 m_13 = m_list.GetItemText(i,12); 35 m_14 = m_list.GetItemText(i,13); 36 m_15 = m_list.GetItemText(i,14); 37 m_16 = m_list.GetItemText(i,15); 38 m_17 = m_list.GetItemText(i,16); 39 m_18 = m_list.GetItemText(i,17); 40 m_19 = m_list.GetItemText(i,18); 41 m_20 = m_list.GetItemText(i,19); 42 m_21 = m_list.GetItemText(i,20); 43 m_22 = m_list.GetItemText(i,21); 44 45 UpdateData(false); 46 return; 47 } 48 49 } 50 MessageBox("找不到记录!"); 51 OnBUTTONClear(); 52 } 53 }
总结
本次课程设计历时两周,现在很高兴完成了,真的学到了不少。完成之后,才发现数据库设计部分,从抽象实体到寻找关系,从学习PowerDesigner到优化触发器才是最难的部分。对于编程,其实核心代码很少,就用到Ado中的两个指针而已,但是通过编程现在终于会连接数据库了,以后可能还会学习ODBC,JDBC,DAO等,同时学习了一下VC的控件使用方法。总之,此次数据库课程设计算是对本学期实验的一次综合实践吧,不过的确花了我们很多的时间,毕竟时间有限,所以前台系统也只是粗略完成了部分功能,数据表项也许还存在不足之处有待完善。同时在此感谢老师一学期的悉心教诲,谢谢。
参考文献
[1] 王珊,萨师煊.《数据库系统概论》.高等教育出版社.2010
[2] 刘刀桂,孟繁晶.《Visual C++实践与提高 数据库篇》.中国铁道出版社.2001
[3] 启明工作室.《Visual C++ + SQLServer数据库应用系统开发与实例》.人民邮电出版社.2004
学生管理信息系统源码(VC6)