前 言 学生学籍管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生学籍管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件学籍,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。 作为计算机应用的一部分,使用计算机对学生学籍信息进行管理,具有着手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高学生学籍管理的效率,也是企业的科学化、正规化管理,与世界接轨的重要条件。 因此,开发这样一套管理软件成为很有必要的事情,在下面的各章中将以开发一套学生学籍管理系统为例,谈谈其开发过程和所涉及到的问题及解决方法。
第一章 系统概述 1.1 开发背景 1.1.1 当前趋势 现代教育技术特别是网络与多媒体技术的发展,对学习活动产生了具有深远意义的冲击,网络中的学习者必须是一个主动行为着的主体,人们可以选择或者设计适合其学习特点的信息采集、加工与重组方式,一种个性化的学习类型。该学籍管理系统采用多层架构的系统,是真正适应教育信息化发展三大趋势的校园网络应用系统,全面支持Internet功能、远程访问功能,全部采用最先进的B/S(浏览器/服务器) 模式来开发,支持有关学校信息交流、日常教学、教务管理等的各种应用,提供了一个基于校园内联网中支持各种类型的学校应用产品的服务平台和开发平台,基本目标是在学校内部和外部建立起顺畅的信息通道,让信息技术成为推动教育生产力的有力工具,提高学校的管理水平和效率,同时充分利用全球的教育资源为学校的教育服务,克服了目前大部分学校的校园网建设只起到宣传作用的通病。 1.1.2 用计算机管理学生学籍的意义 现在我国的中小学校中学籍的管理水平还停留在纸介质的基础上,这样的机制已经不能适应时代的发展,因为它浪费了许多人力和物力,在信息时代这种传统的管理方法必然被计算机为基础的信息管理所取代。 作为一个计算机应用的本科生,希望可以在这方面有所贡献。改革的总设计师邓小平同志说过“科学技术是第一生产力”,我希望能用我四年的所学编制出一个实用的程序来帮助中小学进行更有效的学籍管理。 归纳起来,好处大约有以下几点: 1.可以存储历届的学生学籍,安全、高效; 2.只需一到二名学籍录入员即可操作系统,节省大量人力; 3.可以迅速查到所需信息。 1.2 学籍管理系统概述 1.2.1 开展该系统的原因 由于现今的学籍管理非常繁琐,行政人员付出大量的工作时间,得到的效率很低。因此为提高工作效率,减轻校方人员的工作负担,决定开发学籍管理系统软件。
1.2.2 该工程的基本目标 开发此学籍管理系统软件,以供教学人员及操作者进行学籍管理,方便操作者随时添加、查询、修改等。为了我们提高软件开发的能力,学习汉语编程的技巧,提高工作设计思想,通过本次的工程开发,开发小组成员与辅助老师,公司的技师交流,能从中学习知识吸取经验,再技术和软件思想上同时得到锻炼和提高,从而使总体水升到一个新的高度。 1.3 开发环境以及开发工具介绍 该软件是在Windows 2000 Advanced Server + Visual Basic 6.0 + SQLServer 2000的环境下完成的。下面就对这些开发工具进行介绍: 1.3.1 Visual Basic 6.0 微软公司的Visual Basic 6.0是Windows应用程序开发工具,是目前最为广泛的、易学易用的面向对象的开发工具。Visual Basic提供了大量的控件,这些控件可用于设计界面和实现各种功能,减少了编程人员的工作量,也简化了界面设计过程,从而有效的提高了应用程序的运行效率和可靠性。利用VISUAL BASIC 程序设计语言,可以很方便地设计出在WINDOWS环境下运行的应用程序。故而,实现本系统VB是一个相对较好的选择。 1.3.1.1 VisualBasic的编程特点 VisualBasic语言的出现为Windows下的编程提出了一个新概念,利用Visual Basic的动态数据交换、对象的链接和嵌入、动态链接库、ActiveX技术可以很方便地设计出功能强大的应用程序。 利用VisualBasic语言编程有以下几个特点: 1. 可视化程序设计 在Visual Basic中开发的应用程序,不但有丰富的图形界面,同时由用户为开发图形界面添加的代码真是少而又少,因为在设计图形界面的过程中只需设置 ActiveX控件的属性即可。 2. 强大的数据库和网络功能 随着Visual Basic 语言的向前发展,它在数据库和网络方面的功能优势就愈加明显,利用Visual Basic 中的ODBC——开放式的数据库访问技术可以很方便地开发出自己的数据库应用程序;利用 Visual Basic自带的可视化数据管理器和报表生成器,完全可以在VisualBasic就完成数据库的开发工作。 3.其它特性 在Visual Basic以前的版本中,由于仍然摆脱不了解释执行的代码运行机制,所以在相当的程度上制约了 Visual Basic 的发展。 从Visual Basic5.0版本开始,在Visual Basic 中制作的应用程序都改变为编译执行,使得Visual Basic的代码效率有了很大的提高,同时执行的速度也加快了解30%(同Visual Basic4.0相比)。 当然在 Visual Basic中还有其它特性,例如: l 面向对象的编程语言; l 结构化程序设计; l 事件驱动的程序设计: 在传统的或“过程化”的应用程序中,应用程序自身控制了执行哪一部分代码和按何种顺序执行代码。从第一行代码执行程序并按应用程序中预定的路径执行,必要时才会调用过程。 在事件驱动的应用程序中,代码不是按预定的路径执行,而是在响不同的事件时执行不同的代码片段。事件可以由用户操作触发、也可以由来自操作系统或其它应用程序的消息触发、甚至由应用程序本身的消息触发。这些事件的顺序,决定了代码执行的顺序,因此应用程序每次运行时所经过的路径都是不同的。 l 支持动态链接库; l 应用程序之间的资源共享。 1.3.1.2 VB 支持的数据库系统 VB支持对多格式的数据库的访问和维护,无论是Access还是Foxpro中创建的数据库,都可以用VB打开,对其进行查询、修改和删除等操作。事实上,VB几乎支持对市面上所有数据库的访问。 VB可以访问的数据库可以简单的分为三类,即:Microsoft Access格式数据库,外部数据库和ODBC数据库。VB对多种数据库格式的支持,大大的增强了开发数据库应用程序的能力。 1.3.1.3 Jet数据库引擎 Microsoft引擎为Visual Basic与数据库的接口提供了基本的方法。Jet引擎被Visual Basic,MicrosoftAccess和其他Microsoft产品共享。Jet数据库引擎提供了多种功能,Jet的数据定义功能支持对表、索引、查询的创建、修改和删除。Jet以主键标和表间引用完整性的形式支持数据完整性。 对于数据操纵,Jet支持使用SQL。SQL提供用单独语句对基于用户定义标准的记录组进行检索、添加、删除或更新的方法。 Jet也提供对安全功能的支持。这种功能让开发者指定用户标识符和口令,他们必须在用户访问数据库之前给出。Jet也支持使用许可,或是对单个表和查询的访问级别(例如,只读或读写可访问性)。这是的数据库管理员要对每一位用户或用户组分配对数据库不同特定访问。 除了数据操作和数据定义任务外,也可用Jet引擎来执行其他的任务。Jet还具备在数据库开发工作中所需的其他功能,这些功能包括:数据库修复,数据库压缩(以使消除不同的空间)和重新索引。 1.3.1.4 数据库开发中的三大工具 Visual Basic在数据库应用程序的开发领域中,提供包含数据管理(DataManager),数据控件(Data Control)以及数据编程对象(数据访问对象(DAO)、远程数据对象(RDO)和ActiveX数据对象(ADO))等功能强大的工具,协助设计人员轻松的连接数据库文件,并访问其中的数据,在功能方面与其他一些专业数据库软件(如FoxPro,Micosoft Access等)不相上下。 数据管理器(Data Manager)是Visual Basical已有的老成员之一,拓本盛举有的Jet数据库引擎(Database Engine)可以帮助VB程序元件立即维护数据库内容,并可通过输入查询或查找数据库信息,而不必再通过其他数据库软件另外去设计数据库。 数据控件是VB所提供的基本控件成员之一。它使得设计者省下一堆程序代码编写的工作,能够轻松的设计及维护数据库内容。数据控件可以通过一些属性的设置去链接某个数据库文件,但是它本身并无法显示数据库各个记录的内容,必须在搭配其他具有数据感知(Data Aware)功能的控件对应并显示一个字段内容,以方便地进行记录的浏览及编辑工作。 VB提供的数据访问对象(Data Access Object;DAO)让程序设计者拥有更大的发挥空间。借助程序代码编写,直接控制Jet数据库引擎,配合数据库控件,能够开发出更具弹性且高效率的数据应用程序。 RDO是处理远程数据库的一些专门需要的对象集合。使用RDO可以不用本地的查询机就能访问ODBC数据源,这无疑将大大提高应用程序的性能。 ADO是VB6。0中新增的对象,它是一个更简单的对象模型,它更好的集成了其它数据访问技术,并且对本地和远程数据库均有共同的界面,可以取代DAO和RDO。ADO更易于使用。 我们在本系统中利用数据管理器创建了数据库及数据库表,并采用了ADO数据访问技术。 1.3.2 SQL Server 2000简介 SQL Server 2000是微软公司最新版的大型数据库服务器,其性能指标在各方面都有赶超Oracle数据库的趋势。用它可以方便地管理数据库和开发应用程序,它使用了最先进的数据库构架,与Windows NT/2000平台紧密集成,具有完全的Web功能。通过对高端硬件平台、网络和存储技术的支持,为WEB站和企业的应用最大限度地提供了可扩展性和高可靠性,能在Internet商业领域快速建立并应用。此外,还增强了安全性,保护防火墙内外的数据。支持基于角色的安全并拥有安全审计工具。在经历了SQL Server 6.5和7.0两个版本的尝试后,微软公司终于开始了大规模的业务。记得在以前各种关于SQL Server的文章,都会将其定位成中小型应用方面,这种感觉被大家自然的延续到了2000版之中。其实这是一种误解。在过去的很长一段时间中,微软公司聘请了世界上最优秀的数据库专家以及专门搭建了信息量可谓空前的地理信息系统,励精图治,就是为了摘掉扣在自己头上的这顶帽子。有了强大的性能和功能支持,再配合其一向为人称道的易用性,SQL Server可以说成为了开发者手中的一柄利器!
另外,目前国内的一些关于微软平台的数据库编程教程,喜欢使用Access作为数据库平台的案例,并展开相关的内容。这其实对于开发真正的数据库应用并没有直接的帮助作用,只能使大家停留在应用的初级阶段。SQL Server 2000提供的非常傻瓜的缺省安装和使用模式,其上手难度并不比Access大。另外,SQL Server 2000可以兼顾小、中、大规模的应用,有着远远比Access强大的伸缩性。 1.3.2.1 SQL Server数据库特点 概括起来,SQL Server 2000数据库管理系统具有以下主要特点。 1.丰富的图形管理工具,使系统管理、操作更为直观方便。SQL Server企业管理器是一个基于图形用户界面(GUI)的集成管理工具,利用它可以配置管理SQL Server服务器、管理数据库和数据库对象、备份和恢复数据、调度任务和管理警报、实现数据复制和转换操作等。此外,SQL Server 2000还提供了SQL事件探查器、SQL查询分析器、SQL Server服务管理器和多种操作向导等图形界面管理工具,大大简化了用户操作,从而增强了系统的易用性。 2.动态自动管理和优化功能。即使SQL Server数据库管理员不做任何设置,SQL Server也能够在运行过程中根据环境配置和用户访问情况动态自动配置,以达到最优性能,从而减轻管理员工作。 3.充分的Internet技术支持。Internet网络发展到今天已经成为一条重要的信息发布渠道,SQL Server增强了对Internet技术支持,它除保留了前期版本中的数据库Web出版工具“Web助手”外,还增强了对XML和HTTP技术的支持,这使得电子商务系统能够通过XML等访问SQL Server数据库系统,也扩展了SQL Server在数据挖掘和分析服务领域的应用。 4.丰富的编程接口工具,使用户开发SQL Server数据库应用程序更加灵活。SQL Server提供了Transact-SQL、DB-Library for C、嵌入式SQL(ESQL)等开发工具,Transact-SQL与工业标准SQL语言兼容,并在其基础上加以扩充,使它更适合事务处理方面的需要。此外,SQLServer 2000还支持ODBC、OLE DB、ADO规范,可以使用ODBC、OLEDB、ADO接口访问SQL Server数据库。 5.具有很好的伸缩性和可靠性。SQL Server 2000既能运行在Windows桌面操作系统下,又可运行在服务器操作系统(包括Windows NT和Windows 2000)下;既能运行在单CPU计算机上,又能运行在对称多处理系统下。所以,它具有很好的伸缩性,能够满足从桌面应用到大型企业分布式应用到不同层次用户的要求。 6.简单的管理方式。SQL Server 2000与Microsoft Windows 2000有机集成,所以可以使用Windows 2000的活动目录(Active Directory)功能对SQL Server进行集中管理,大大简化大型企业中的系统管理工作。此外,与Windows2000的集成还使SQL Server能够充分利用操作系统所提供的服务和功能(如安全管理、事件日志、性能监视器、内存管理和异步I/O等),从而增强了SQL Server数据库系统的功能,并且只需要占用很少的系统资源。 1.3.3 ADO对象概述 ADO对象是针对当前微软的软件所支持的数据进行操作的最为有效、简单并且功能强大的方法。它可以把大部分数据源可编程的属性直接扩展到Active Server上,主要含有Connection、Recordset与Command三种对象。其中:Connection对象主要负责打开或连接数据库文件;Recordset对象主要是存取数据库的内容;Command对象主要是对数据库下达行动查询指令以及SQL Server的Stored Proceduce。 ADO对象能够存取到数据库的内容,首先要求数据库的驱动程序(ODBC驱动程序与OLE DB驱动程序)必须安装上,否则,ADO对象是无法存取数据库中内容,其原理示意图如图1.1所示:
| | file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif |
图1.1 ADO对象存取数据原理示意图 请注意:上图中的“各种数据库所对应的驱动程序”即ODBC驱动程序与OLE DB驱动程序。 1.3.3.1 利用ADO开发网络数据库应用程序 ADO(Active Date Objects,即ActiveX数据对象)是一个ASP内置的ActiveX服务器组件(ActiveX Server Component)。可把它与ASP结合起来,建立提供数据库信息的网页内容,对数据库进行查询、插入、更新、删除等操作,并可以把在用户端实现“网上实时更新显示”的最新Web数据库技术。 要执行ADO,服务器端必须安装Windows NT Server 和Internet InformationServer(IIS),而客户端只要有IE或NETSCAPE较新版本的浏览器即可。 利用ADO开发网络数据库应用程序有以下几个优点: ⑴ 支持客户机/服务器结构(Client/Server)与Web系统开发技术。 ⑵ 内部有多个互相独立的对象模型。 ⑶ 支持分批修改数据库内容。 ⑷ 支持多种不同的数据控制指标形式。 ⑸ 先进的Recordset数据高速缓存管理功能。 ⑹ 允许在程序中使用多个Recordset对象或者多个分批修改区块传送。 ⑺ ADO属于Free_threaded对象,利用它可以开发出更有效的Web应用程序。 1.3.3.2 ADO组件的主要对象及其功能 ADO组件又称为数据库访问组件,它提供了以下七种对象: Connection对象:提供对数据库的连接服务。 Command对象:定义对数据库源操作的命令。 Recordset对象:由数据库服务器所返回的记录集。 ●Recordset对象的LockType属性的设置值 常量 | | | | | | | | 保守式记录锁定(逐条)。提供者执行必要的操作确保成功编辑记录,通常采用立即锁定数据源的记录的方式。 | | | 开放式记录锁定(逐条)。提供者使用开放式锁定,只在调用Updata方法时锁定记录。 | | | 开放式批更新。用于与立即更新模式相反的批更新模式。 |
Fields对象:由数据库服务器所返回的单一数据字段 Parametes对象:表示Command对象的参数。 Property对象:单独的一个Property对象,提供属性功能。 Error对象:提供处理错误的功能。 使用ADO对象可以建立和管理数据库的连接,按数据库服务器的要求获得数据,执行更新、删除、添加数据等操作,获取ODBC的错误信息等。 1.3.3.3 用来操纵数据的SQL命令 SQL命令是发送给数据库并要求数据库操作的指令,它是专门为数据库设计的语言,比一般的计算机程序语言简单的多。SQL命令主要分成两部分:DDL(Data Definition Language)和DML(Data Manipulation Language),其中DDL是建立数据表及数据列的指令群,而DML则是操作数据库记录的指令群,如数据库记录的添加、更新、删除、和查询等。 SQL命令,包括Select、Delete、Update、InsertInto、Select Into等。 ⑴ 筛选及排序记录的Select指令 基本句型一:Select 字段串列 From 数据表 基本句型二:Select … From … Where 筛选条件 基本句型三:Select … From … Order By字段串列 Select Top:限定选取数据的条数 ⑵ 删除数据记录的Delete指令 基本语法:Delete From 数据表 Where 条件式 ⑶ 更新数据记录的Update指令 基本语法:Update 数据表Set 表达式 ⑷ 增加数据记录的Insert Into 指令 基本句型一:Insert Into 数据表 (字段串列) Values (字段串列) 基本句型二:Insert Into 数据表 (字段1,字段2,…,字段n) Select … ⑸ 建立新数据表的Select Into 指令 该指令与“Insert Into … Select …”指令的区别是,这个指令将建立另一个新的数据表,而InsertInto是增加数据记录到“现存的”数据表中。 1.2.4 Visual Basic 6.0访问数据库的过程 ①定义数据库组建 Dim con AsNew ADODB.Connection ②打开数据库 对于SQL数据库,其连接语句为con.Open "driver={sqlserver};server= localhost;uid=sa;pwd=;database=student"。而对于Access数据库,连接语句为 con.Open "Provider=Microsoft.Jet.OLEDB.4.0;DataSource= " & App.Path + "\student.mdb" ③设定SQL语句,使用“Execute”命令,即可开始执行访问数据库的动作 Dim rs As New ADODB.Recordset 其中rs为结果集对象(RECORDSET) ④关闭结果集对象,断开与数据库的连接 rs.Close Con.Close 第二章 系统整体规划 2.1数据库的设计 在系统设计过程中,首先要建立的就是数据库。本数据库采用SQL Server 2000来构造,共使用了7个表,它们分别是用户信息表(UserInfo)、学生信息表(StuInfo)、班级信息表(Class)、专业信息表(Major)、学院信息表(Depart)、课程信息表(Lesson)、学生成绩表(Result)。 1.用户信息表(UserInfo): 2.学生信息表(StuInfo): 3.班级信息表(Class): 4.专业信息表(Major): 5.学院信息表(Depart): 6.课程信息表(Lesson): 7.学生成绩表(Result): 2.2系统流程图
| | file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif |
| | file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image003.gif |
图2.1 系统流程图 2.3 系统功能分析
系统开发的目标是实现学生学籍管理的系统化、规范化和自动化,这是在 用户要求的基础上提出来的,功能要求如下: (一)学生信息管理:能对学生信息进行添加、修改、删除。 (二)课程管理:对课程进行添加、修改、删除操作。 (三)专业/学院设置: (三)考试成绩管理: (四)查询学生信息:根据学号或姓名对学生信息进行精确/模糊查询 (五)用户管理:定义使用本系统的用户名称及密码 第三章 系统具体实现 经过需求分析、功能模块设计之后要进入详细设计阶段,本阶段将按系统的主要模块进行论述,重在阐述具体的某项功能的实现方法或运用到的相关技术。 3.1 准备工作 1.添加引用:单击工程菜单中的引用选项,添加Microsoft ActiveX Data Objects 2.6 Library和MicrosoftExcel 9.0 Object Library两个引用。 2. 添加部件:单击工程菜单中的部件选项,添加Microsoft ADO Data Control 6.0(OLEDB)、MicrosoftCommon Dialog Control 6.0(SP3) 、Microsoft FlexGridControl 6.0、Microsoft Windows Common Controls 6.0(SP4)和Microsoft Windows Common Controls-2 6.0五项。 3.2 模块设计 添加两个模块module1和module2,在module1中添加如下代码 Option Explicit Global con As New ADODB.Connection Global rs As New ADODB.Recordset Global classid As String, stuid AsString Global LoginUser As String, LoginPowerAs String LoginUser记录当前登陆用户的用户名,LoginPower记录当前登陆用户的权限 Dim Userid As String, Userpwd AsString, Username As String, Userpower As String Dim sqlstr As String Sub Main() If App.PrevInstance = True Then MsgBox "注意程序已经运行,不能再次装载!", vbOKOnly Exit Sub Else Con.Open "Provider=Microsoft.Jet.OLEDB.4.0;DataSource="&App.Path+"\student.mdb" Frmlogin.Show End If End Sub 在module2中添加代码(MD5算法) 详细代码见程序中module2.bas 3.3 用户界面实现 3.3.1 登陆界面(frmlogin) 因为本系统是按学籍管理的思想设计的,故而登陆部分主要完成密码校验、确定管理员等功能,对于密码本系统采用的是MD5算法。这里附上本程序的登陆界面,见图3.1。 file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg 图3.1 用户登陆界面 在代码窗口的“通用”部分,定义一个模块级的公共变量loginno用来记录当前密码输入错误的次数 Dim loginno As Integer 在Form的Load事件中,将txtuser设置为焦点,初始化loginno。 Private SubForm_Load() loginno = 0 Me.Show txtuser.SetFocus End Sub 这里将“确定”和“取消”两个按钮作为一个按钮数组cmdOkCancel:确定按钮的index属性为0,取消按钮的index属性为1。 利用SQL语句,在数据库中查询,如果查到相应的记录,则调用Case 0事件,用户的登陆获得通过,此时可以退出登陆窗口,并进入MDI主窗口,同时将用户类型和用户名分别传递到MDI主窗口和frmmanage中;如果没有相应的记录,则给出提示错误信息,同时将用户输入错误密码次数增加1,如果错误超过3次,则退出整个系统;若次数还没有超过3次,则提示用户重新输入。 根据以上的设计,cmdOkCancel的Click事件的代码如下: Private SubcmdOkCancel_Click(Index As Integer) Select Case Index Case 0 …… Userid = Trim(txtuser.Text) Userpwd = MD5(Trim(txtPassword.Text)) sqlstr = "select * from UserInfowhere UserID='" & Userid & "'" rs.Open sqlstr, con, 1, 1 If Not rs.EOF Then If rs("UserPWD") <>Userpwd Then '密码错误时 MsgBox "您输入的密码不正确!", vbQuestion Me.Caption = "请输入用户名和密码:" loginno = loginno + 1 '当错误的密码次数达到3次时,不能登陆,退出! If loginno =3 Then MsgBox "对不起,您不能使用该系统!请与管理员联系。", vbInformation Unload Me Exit Sub End If …… Else LoginUser = Userid '保存当前登陆用户名 LoginPower = rs.Fields(3) '将当前登陆用户的权限保存到LoginPower中 Unload Me frmflash.Show End If Else MsgBox "没有您输入的用户名!", 32 …… End If rs.Close: Set rs = Nothing Case 1 ‘退出整个程序 Unload Me EndSelect End Sub 3.3.2 MDI主窗口(frmmain) 本系统采取多文档界面(MultiDocumentInterface)。多文档界面是一种Windows用户界面标准。它有一个父窗口,在典型情况下,父窗口用来显示程序菜单以及包含子窗口。 在工程中添加一个MDI窗口,取名为“frmmain.frm”,并为MDI窗体进行菜单和代码的设计,其运行界面如图3.2: file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg 图3.2 主界面 3.3.2.1 菜单设计 MDI主窗体是整个系统的容器,为了方便用户的使用,应设计相应的菜单和代码。 3.3.2.2 窗体代码设计 1.在代码窗口的通用部分,声明一个API函数用于打开帮助文件和调用Outlook发送邮件。 Private Declare FunctionShellExecute& Lib "shell32.dll" Alias "ShellExecuteA"(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVallpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) 2.判断用户权限 如果登陆的为普通用户类型的用户,则用户不能使用“用户管理”这一功能,而对于管理员类型的用户,则没有此限制。所以在MDIForm的Load事件中需要判断用户类型。 Private SubMDIForm_Load() StatusBar.Panels(2).Text = "当前操作员:" & LoginUser & " " & LoginPower & "" If LoginPower = "普通用户" Then filemenu11.Enabled = False Toolbar1.Buttons.Item(5).Enabled = False End If End Sub 3.Form的QueryUnload事件 当用户要退出MDI窗体时,需要在 QueryUnload事件中询问用户是否真的要退出本系统;如果用户不要退出,则将Cancel置为1,取消整个退出过程。 Private SubMDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer) If MsgBox("确定要退出学生档案管理系统吗?是/否", vbYesNo+vbQuestion+ vbDefaultButton1) =vbNo Then Cancel = 1 End If End Sub QueryUnload和Unload事件 当一个子窗体或一个Form对象关闭时,在那个窗体中的QueryUnload事件先于该窗体的Unload事件发生,Unload事件在Terminate事件之前发生。 当一个应用程序关闭时,可使用QueryUnload或Unload事件过程将Cancel属性设置为True来阻止关闭过程。但是,QueryUnload事件是在任一个卸载之前在所有窗体中发生,而Unload是在每个窗体卸载时发生。 在这两个事件中,均可将Cancel设置为任何非零的值来防止窗体被删除。但Unload不能阻止其他事件,诸如从Microsoft Windows操作环境中退出等;而QueryUnload事件则可以阻止从Windows中的退出。有介于此,通常来说都是在QueryUnload中询问用户是否要退出当前窗体。 4.“重新登陆”子菜单的代码 当单击了“重新登陆”或者按下了“F2”键时,将会给出提示,如果用户在提示框中按下了“确定”按钮,则退出整个MDI主窗体,并显示登陆窗体。 Private Subfilemenu15_Click() If MsgBox("若重新登陆,所有窗体都将关闭!是否重新登陆?", vbYesNo + vbQuestion, "重新登陆") =vbYes Then Unload Me
Frmlogin.Show End If End Sub 5.“帮助主题”子菜单的代码 调用Windows API函数,打开help.chm帮助文件。 Private Subfilemenu21_Click() ShellExecute 0,"open", App.Path & "\help.chm", "","", 1 End Sub 6.“给我发邮件”子菜单的代码 如果用户单击了“给我发邮件”子菜单,则会调用API函数,调用Outlook。 Private Subfilemenu22_Click() ShellExecute Me.hwnd, "open","mailto:datou158@etang.com", "", App.Path, 1 End Sub 7.当用户单击查询学生资料菜单项或者按下F3键时,将会出现“查找学生”窗体,供用户查找满足特定要求的学生信息。 Private Subfilemenu45_Click() '查找学生 frmstusearch.Show 1 End Sub 3.3.3 用户管理窗体(frmmanage) 向项目中添加窗体,并命名为frmmanage.frm。窗体的控件设计如图3.3所示 file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image007.jpg 图3.3 用户管理界面 如果登陆的用户类型是管理员,用户管理一项是可用的,当单击该子菜单时,将会出现用户管理窗口,管理员可以对系统用户进行添加和删除操作。 3.3.3.1 窗体代码设计 1.定义一个整型变量DelNO用来存储当前系统用户的数目,当DelNO<=1时提示用户不能再删除用户。在该窗体的通用部分写如下代码: Dim DelNO As Integer 2.窗体加载时,初始化Listview用以显示系统用户列表,代码如下 Private SubForm_Load() '初始化ListView Dim clmX AsColumnHeader Set clmX =ListView.ColumnHeaders.Add(, , "用户名",ListView.Width / 3) Set clmX =ListView.ColumnHeaders.Add(, , "密码",ListView.Width / 6, 2) Set clmX =ListView.ColumnHeaders.Add(, , "姓名",ListView.Width / 4, 2) Set clmX =ListView.ColumnHeaders.Add(, , "用户权限", ListView.Width / 4, 2) Combo1.Clear Combo1.AddItem"普通用户" Combo1.AddItem"超级用户" Combo1.ListIndex= 0 LoadOperator End Sub 其中调用了LoadOperator函数,该函数用来显示和刷新Listview中的数据 Private SubLoadOperator() On Error Resume Next Dim Listit As ListItem ListView.ListItems.Clear ListView.LabelEdit= lvwAuto ListView.View= 3 Dim ef As New ADODB.Recordset sqlstr ="select * from UserInfo" ef.Opensqlstr, con, 1, 1 DelNO =ef.RecordCount Do While Not ef.EOF Set Listit = ListView.ListItems.Add(, ,ef.Fields("UserID")) Listit.SubItems(1) = "***" 隐藏用户的密码,用***来替代。 Listit.SubItems(2) =ef("UserName") Listit.SubItems(3) =ef("UserPower") ef.MoveNext Loop Set ef =Nothing End Sub 3.添加用户 在Textbox中输入了相应的数据以后,按添加按钮则调用该按钮的Click事件,代码如下 当单击“添加”按钮时,首先检查输入的用户名和密码是否为空,代码如下: Private Sub Command4_Click() If Trim(Text1.Text) = "" Then MsgBox "登陆用户名不允许为空!", vbOKOnly + 48, "提示:" Text1.SetFocus ExitSub End If If InStr(1,Trim(Text1.Text), "'", vbTextCompare) Then MsgBox "用户姓名中有特殊字符" + "<'>,请删除。", vbOKOnly + 48, "提示:" Text1.SetFocus ExitSub End If If Trim(Text2.Text) = "" Then MsgBox "密码不能为空,请输入密码!", vbOKOnly + 48, "提示:" Text2.Text = "" Text3.Text = "" Text2.SetFocus Exit Sub End If End Sub 如果不为空,则检查用户名是否有重复,需要打开系统信息表, Private SubCommand4_Click() …… sqlstr= "select * from UserInfo where UserID='" & Text1.Text &"'" rs.Open sqlstr, con, 1, 1 End Sub 如果当前记录不为空,则逐条记录检查是否有重复 Private Sub Command4_Click() …… Userid = Trim(Text1.Text) Userpwd = MD5(Trim(Text2.Text)) Username = Trim(Text4.Text) Userpower = Trim(Combo1.Text) DelNO =rs.RecordCount Do While Not rs.EOF …… rs.MoveNext Loop …… End Sub 如果有重复,则提示已存在这个用户,然后将焦点设置给Text1,并将所有的文本框清空。 Private Sub Command4_Click() …… Do While Not rs.EOF IfText1.Text = rs.Fields("UserID") Then MsgBox "已经存在用户名为 " & Userid & " 的用户帐号", vbInformation Text1.SetFocus Exit Sub EndIf rs.MoveNext Loop rs.Close: Set rs = Nothing End Sub 如果没有重复,再检查两次输入的密码是否一致,如果不一致,则提示“两次密码不一致”。 Private Sub Command4_Click() …… If Trim(Text3.Text)<> Trim(Text2.Text) Then MsgBox "两次密码不相同,请重输入!", vbOKOnly + 48, "提示:" Text2.Text= "" Text3.Text= "" Text2.SetFocus Exit Sub End If End Sub 如果以上全部正确无误的设置好了,则将新用户的信息添加到数据表中,并提示“添加新用户成功”。 Private Sub Command4_Click() sqlstr = "insert into UserInfo(UserID,UserPWD,UserName,UserPower)" sqlstr = sqlstr &"values('" & Userid & "','" & Userpwd &"', " sqlstr = sqlstr & "'"& Username & "','" &Userpower & "')" con.Execute sqlstr MsgBox "添加用户" & Text1.Text & "成功",vbOKOnly, "添加系统用户" Text1.Text= "" Text2.Text= "" Text3.Text= "" Text4.Text= "" '更新列表 LoadOperator End Sub 4.删除系统用户 当用户双击ListView中的数据时,则会调用DeleteRecord()函数,如果系统用户只剩一个,则提示用户不能再删除;反之要求输入您想要删除的用户的密码,密码正确时才可以将该用户删除,密码错误时则不采取任何措施;最后调用LoadOperator显示并刷新Listview中的数据。根据以上的设计,DeleteRecord()的代码如下: Private SubDeleteRecord() '删除用户操作 On ErrorResume Next IfListView.SelectedItem.Selected Then If DelNO <= 1 Then MsgBox "只剩下一个用户帐号,不允许再删除!", vbInformation ElseIf MsgBox("确定要删除用户名为"& ListView.SelectedItem.Text &"的用户帐号吗?", vbYesNo + 32 + vbDefaultButton2) =vbYes Then sqlstr = "select * from UserInfowhere UserID='" & ListView.SelectedItem.Text & "'" rs.Open sqlstr, con, 1, 1 If MD5(InputBox("请输入该用户的密码:")) = rs.Fields("UserPWD") Then sqlstr = "delete from UserInfo whereUserID='" & ListView.SelectedItem.Text & "'" con.Execute sqlstr Else MsgBox "对不起!您输入的密码不正确,删除该用户失败!", vbInformation End If LoadOperator End If End If rs.Close: Setrs = Nothing End Sub 5.菜单设计 在Listview中单击鼠标右键会调用ListView的MouseUp事件,出现右键菜单menuOpertor, file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg 具体实现如下: Private SubListView_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = 2 Then PopupMenu menuOperator End If End Sub 实现该右键菜单各项功能的代码如下: Private SubmenuAdd_Click() '添加用户 Text1.SetFocus End Sub Private SubmenuDel_Click() '删除用户 DeleteRecord End Sub 3.3.4 修改密码窗体(frmchgPWD) 当用户要更改密码时,单击“系统选项/修改个人密码”菜单,弹出如图3.4所示窗体。在MDI主窗体编辑窗口中,单击“系统选项/修改个人密码”,添加如下代码: Private Subfilemenu12_Click() '修改密码界面 Frmchgpwd.Show 1 End Sub file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image009.jpg 图3.4 修改用户密码 当用户输入完毕时,单击“确定”按钮,引发Click事件。这时,先检查两次输入的密码是否一致,如果不一致,则提示用户,将焦点设置到第二个Text2控件,后面两个文本框清空,代码如下: Private SubCommand1_Click() Dim Oldpwd As String, pwd As String,confirmpwd As String Oldpwd = Trim(Text1.Text) pwd = Trim(Text2.Text) confirmpwd = Trim(Text3.Text) …… If Trim(pwd)<> Trim(confirmpwd) Then MsgBox "两次输入的密码不相同!", vbInformation Text2.Text = "" Text3.Text= "" Text2.SetFocus ExitSub End If End Sub 如果密码一致,则判断输入的原密码是否正确,如果正确则将新密码写入数据库,这时需要一个字符串变量表达SQL语句,一个Recordset对象变量打开系统信息数据表。然后打开数据库,并将新密码写入,提示用户密码修改成功。 Private SubCommand1_Click() …… sqlstr = "select UserPWD fromUserInfo where UserID='" & LoginUser & "'" rs.Open sqlstr, con, 1, 1 If Not rs.EOF Then If rs("UserPWD") <> Oldpwd Then MsgBox "你输入的原密码不对!",vbInformation Text1.Text = "" Text2.Text = "" Text3.Text = "" Text1.SetFocus Exit Sub Else sqlstr = "update UserInfo set UserPWD='" & pwd &"' where UserID='" & LoginUser & "'" con.Execute sqlstr MsgBox "您的密码更新成功,请牢记你的密码!", vbInformation Unload Me End If Else MsgBox "异常错误!",vbInformation End If rs.Close: Set rs = Nothing End Sub 修改完毕后,单击“取消”退出此窗体。 Private SubCommand2_Click() Unload Me End Sub 3.3.5 浏览学生信息窗体(frmstu) 在工程中添加一个窗体,命名为frmstu.frm,这里将使用frmstu窗体,来实现浏览学生信息的功能,该界面运行时如图3.5所示 file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image011.jpg 图3.5 浏览学生信息窗体 在该窗体中,用户可以查看/修改学生的信息,还可以添加/删除学生信息,所以用一个Treeview和一个Listview分别显示班级列表和该班级下面的学生列表,用Image和PictureBox来调整控件的大小。具体设置如表3.1所示 对象 | | | | | | | | | | | | | | | | tvwTreelinesPlusMinusPictureText | | | | | | | | | | | | | | | |
表3.1 FrmStu中部分控件的属性 当窗体启动时,需要在Treeview中加载班级列表,并初始化Listview中的标题。 Private SubForm_Load() Call TreeviewLoad Dim clmX As ColumnHeader Set clmX = ListView.ColumnHeaders.Add(, ,"学 号", ListView.Width /7) …… End Sub 在Form_Load事件中调用了TreeviewLoad函数,由于篇幅省略该函数的代码,具体实现见源程序。 当窗体大小发生变化时,调用Form_Resize,调整Frmstu中控件的大小。 Private SubForm_Resize() IfWindowState <> 1 Then If Me.Height < 3000 Then Me.Height =3000 If Me.Width < 3000 Then Me.Width = 3000 SizeControls imgSplit.Left End If ListView.Width= Me.Width ListView.ListItems(0).Width= 5000 End Sub SubSizeControls(X As Single) On Error Resume Next '设置Width 属性 If X < 1500 Then X = 1500 If X > (Me.Width - 1500) Then X =Me.Width - 1500 TreeView.Width = X imgSplit.Left = X ListView.Left = X + 50 ListView.Width = Me.Width - (TreeView.Width+ 100) TreeView.Height =Me.ScaleHeight - 50 ListView.Top =TreeView.Top ListView.Height = TreeView.Height imgSplit.Top = TreeView.Top imgSplit.Height = TreeView.Height End Sub 单击Treeview中的班级号码则调用TreeView_NodeClick事件和ListviewLoad事件在Listview中显示该班级下面学生的信息列表。 Private SubTreeView_NodeClick(ByVal Node As MSComctlLib.Node) '正在导入数据,提示用户等待 Me.MousePointer = 11 If Node.Tag = "classid" Then '开始在ListView中显示数据 classid = Left(Node.Text, 6) Call ListviewLoad(classid) ElseIfNode.Key = "S" Then Call SqlListview(SqlSearch) Else ListView.ListItems.Clear End If End Sub Public Sub ListviewLoad(ByVal classid As String) Dim Listit As ListItem ListView.ListItems.Clear ListView.LabelEdit= lvwManual ListView.View= 3 Dim ef As New ADODB.Recordset classid =Left(classid, 6) sqlstr ="select * from StuInfo where SID like '" & classid &"__' order by SID" ef.Opensqlstr, con, 1, 1 Do While Not ef.EOF Set Listit = ListView.ListItems.Add(, ,ef.Fields("SID")) Listit.SubItems(1) =ef.Fields("SName") Listit.SubItems(2) =ef.Fields("SGender") Listit.SubItems(3) =ef.Fields("SMinzu") Listit.SubItems(4) =ef.Fields("SZhengzhi") Listit.SubItems(5) =ef.Fields("SDormitory") Listit.SubItems(6) =ef.Fields("SAddress") ef.MoveNext Loop ef.Close: Setef = Nothing ListView.SetFocus End Sub 在显示该班级下面所有学生信息的同时,用户可以对记录进行管理:添加新记录、编辑或者删除当前记录,为此在Listview中创建右键菜单,用来对记录进行操作。 在本系统中,在系统默认情况下,班级编号作为学号的前面六位。为了体现这一关系,需要将班级编号赋给显示学号的文本框。 “添加”子菜单的Click事件的设计思路: 用户单击“添加”子菜单时,调用frmmain中的“添加学生信息”子菜单显示FrmAddStu窗体,同时将Command1的Caption属性设置为“确定(&O)”。 Private Subpop3_Click() '添加学生资料 Call Frmstu.AddStu End Sub Public SubAddStu() CallFrmAddStu.LoadStu("00000000") End Sub 修改学生资料的Click事件的设计思路和添加学生资料的设计思路类似,但是由于只是对记录进行修改,不需要调用AddNew操作,只要对数据进行Update操作即可。 Private Subpop4_Click() '修改学生资料 Call Frmstu.ModifyStu End Sub Public SubModifyStu() '显示窗口 Dim EditNumAs String IfListView.SelectedItem.Selected Then EditNum = CStr(ListView.SelectedItem.Text) Call FrmAddStu.LoadStu(EditNum) Else Exit Sub End If End Sub 删除学生资料的设计思路: 在删除记录之前弹出询问框,确认用户是否真的要删除当前记录,如果用户选择了“是”,则删除该条记录,否则就不执行任何操作。 在删除记录过程中,使用学生的学号作为关键字,调用Execute方法来删除当前记录。 在删除了当前记录以后,需要重新移动当前记录;由于改变了当前记录集的内容,所以需要调用ListviewLoad子过程来刷新Listview中的内容。 Private Subpop5_Click() '删除学生资料 Call Frmstu.DelStu End Sub Public SubDelStu() IfListView.SelectedItem.Selected Then If MsgBox("确定要删除学号为 " & ListView.SelectedItem.Text &"的全部资料吗!", vbYesNo + 32 + vbDefaultButton2) =vbYes Then sqlstr = "delete from StuInfowhere SID='" & ListView.SelectedItem.Text & "'" con.Execute sqlstr Call ListviewLoad(classid) End If End If End Sub 学生信息包括了学号、姓名、出生日期、性别、家庭住址、联系电话等内容。在Listview中列出了各学籍信息的学号和姓名以供用户进行导航,但是在实际管理中,还需要显示出某一条学生信息的详细列表。为此,设计详细信息框,来罗列用户的各种详细信息。当用户单击“显示该生详细资料”子菜单时,显示frmstuinfo窗体(图3.6),并以学生学号为关键字,将该学生的全部资料赋值给frmstuinfo中的对应文本框。 file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg 图3.6 学生详细信息 Private Subpop1_Click() '显示详细资料 Call Frmstu.ListView_DblClick End Sub Public SubListView_DblClick() On ErrorResume Next IfListView.SelectedItem.Selected Then SelectNum = ListView.SelectedItem.Text If SelectNum <> "" Then '显示出该生全部信息表单 Call frmstuinfo.LoadStuInfo(SelectNum) Else Exit Sub End If End If End Sub 在frmstuinfo的代码窗口中添入以下代码用来显示该学生的详细资料。 Public SubLoadStuInfo(StuNum As String) sqlstr = "select * from StuInfowhere SID='" & StuNum & "'" rs.Open sqlstr, con, 1, 1 StuInfo(0).Caption =rs.Fields("SID") StuInfo(1).Caption =rs.Fields("SName") StuInfo(2).Caption =rs.Fields("SGender") StuInfo(3).Caption =rs.Fields("SZhengzhi") StuInfo(4).Caption =rs.Fields("SPlace") StuInfo(5).Caption =rs.Fields("SMinzu") StuInfo(6).Caption =rs.Fields("SBirthday") StuInfo(7).Caption =rs.Fields("SDormitory") StuInfo(8).Caption =rs.Fields("SAddress") StuInfo(9).Caption =rs.Fields("SCode") StuInfo(10).Caption = rs.Fields("STel") StuInfo(11).Caption =rs.Fields("SRemark") rs.Close: Setrs = Nothing Me.Show 1 End Sub 3.3.6 添加/修改学生信息窗体(frmAddstu) 该窗体运行时界面如图3.7所示 file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg 图3.7 添加/修改学生信息界面 当窗体加载时,首先判断是修改学生资料还是添加新的学生资料,如果学号为“00000000”,则为添加新的学生资料,反之则为修改学生资料。如果为修改资料,则以学生的学号为关键字将该学生的信息加载到该窗体的对应文本框,同时将该学号框(EditStu(0))的Enable属性设置为False。如果为添加新的学生资料,则将学号的前6位置为该班级的ID,并将学号输入框的SelStart属性设为6。根据以上设计,在Form_Load中添加如下代码: Private SubForm_Load() '确定添加或者修改,保存数据 Combo1.Clear Combo1.AddItem"男" Combo1.AddItem"女" Combo1.ListIndex= 0 Combo2.Clear Combo2.AddItem"" Combo2.AddItem"团员" Combo2.AddItem"党员" Combo2.AddItem"预备党员" Combo2.ListIndex= 1 Combo3.Clear Combo3.AddItem"汉族" Combo3.AddItem"瑶族" Combo3.AddItem"土家族" Combo3.AddItem"侗族" Combo3.AddItem"白族" Combo3.AddItem"苗族" Combo3.AddItem"回族" Combo3.AddItem"壮族" Combo3.ListIndex= 0 If EditNum = "00000000" Then Me.Caption = "添加学生资料(班级:" & classid & ")" Command1.Caption = "添加(&A)" EditStu(0).Text = classid EditStu(0).SelStart = 6 Else Me.Caption = "修改学号为" & EditNum & "的学生资料" EditStu(0).Enabled = False Command1.Caption = "修改(&M)" Dim rs As New ADODB.Recordset, sqlstr AsString sqlstr = "select * from StuInfo whereSID='" & EditNum & "'" rs.Open sqlstr, con '把数据代入文本框中 EditStu(0).Text = rs.Fields("SID") EditStu(1).Text =rs.Fields("SName") EditStu(2).Text =rs.Fields("SBirthday") EditStu(3).Text =rs.Fields("SPlace") EditStu(4).Text =rs.Fields("SAddress") EditStu(5).Text =rs.Fields("SCode") EditStu(6).Text = rs.Fields("STel") EditStu(7).Text =rs.Fields("SDormitory") EditStu(8).Text =rs.Fields("SRemark") Ifrs.Fields("SGender") = "男"Then Combo1.ListIndex = 0 ElseIfrs.Fields("SGender") = "女"Then Combo1.ListIndex = 1 EndIf Ifrs.Fields("SZhengzhi") = "" Then Combo2.ListIndex = 0 ElseIfrs.Fields("SZhengzhi") = "团员"Then Combo2.ListIndex = 1 ElseIfrs.Fields("SZhengzhi") = "党员"Then Combo2.ListIndex = 2 ElseIfrs.Fields("SZhengzhi") = "预备党员" Then Combo2.ListIndex = 3 End If Select Case rs.Fields("SMinzu") Case "汉族": Combo3.ListIndex = 0 Case "瑶族": Combo3.ListIndex = 1 Case "土家族": Combo3.ListIndex = 2 Case "侗族": Combo3.ListIndex = 3 Case "白族": Combo3.ListIndex = 4 Case "苗族": Combo3.ListIndex = 5 Case "回族": Combo3.ListIndex = 6 Case "壮族": Combo3.ListIndex = 7 End Select rs.Close: Set rs = Nothing End If End Sub 当用户按下Command1按钮时,触发该按钮的Click事件。首先判断用户输入的信息是否符合要求, …… If Trim(EditStu(0).Text) = "" OrVal(Trim(EditStu(0).Text)) > 99999999 Or Val(Trim(EditStu(0).Text)) <= 0Or Len(EditStu(0)) <> 8 Then MsgBox "学号输入有错误!请重新输入学号(xxxxxxxx)!",vbInformation EditStu(0).SetFocus Exit Sub End If If Trim(EditStu(1).Text) = "" Then MsgBox "必须输入学生的姓名!", vbInformation EditStu(1).Text = "" EditStu(1).SetFocus Exit Sub End If If IsDate(EditStu(2).Text) = False Then MsgBox "请按照(YYYY-MM-DD)的格式输入出生年月!", vbOKOnly +vbExclamation, "警告" EditStu(2).SelLength = Len(EditStu(2).Text) EditStu(2).SetFocus Exit Sub End If Dim i As Integer For i = 0 To8 If InStr(1, EditStu(i).Text, "'",1) Then MsgBox "添加的资料有非法字符(不允许输入'号)!",vbInformation Exit Sub EditStu(i).SetFocus End If Next 检测数据完毕后,就开始对输入的数据进行操作,如果是添加新资料则判断是否存在该学生的资料,如果该学生信息已经存在则提醒用户该学生资料已经存在,反之则将该学生的资料添加到数据库中;如果是修改学生资料则在数据库中以学号为关键字搜索该学生的资料,然后将该学生的资料更新。 …… 错误!未找到图形项目表。If EditStu(0).Enabled Then '添加资料 sqlstr = "select * from StuInfo whereSID='" & EditStu(0).Text & "'" rs.Open sqlstr, con, 1, 1 If Not rs.EOF Then MsgBox "已经存在学号为" & EditStu(0).Text & "的学生资料,请重新输入!", vbInformation EditStu(0).SetFocus Exit Sub End If rs.Close: Set rs = Nothing sqlstr="insert into StuInfo(SID,SName,SGender,SPlace,SBirthday,SMinzu,SZhengzhi,SDormitory,SAddress,SCode,STel,SRemark)" sqlstr = sqlstr & "values('"& EditStu(0).Text & "','" & EditStu(1).Text &"','" & Combo1.Text & "'," sqlstr = sqlstr & "'" &EditStu(3).Text & "','" & EditStu(2).Text &"','" & Combo3.Text & "','" & Combo2.Text &"','" & EditStu(7).Text & "'," sqlstr = sqlstr & "'" &EditStu(4).Text & "','" & EditStu(5).Text &"','" & EditStu(6).Text & "','" &EditStu(8).Text & "')" Else ' '修改资料 sqlstr= "update StuInfo set SName='" & EditStu(1).Text &"',SBirthday='" & EditStu(2).Text & "',SGender='"& Combo1.Text & "'," sqlstr = sqlstr & "SPlace='"& EditStu(3).Text & "',SMinzu='" & Combo3.Text &"',SZhengzhi='" & Combo2.Text & "',SAddress='"& EditStu(4).Text & "'," sqlstr = sqlstr & "SCode='"& EditStu(5).Text & "',STel='" & EditStu(6).Text &"',SDormitory='" & EditStu(7).Text & "',SRemark='"& EditStu(8).Text & "' " sqlstr = sqlstr & "whereSID='" & EditStu(0).Text & "'" End If con.Executesqlstr …… 如果是添加新资料,操作完毕后则提示用户是否继续添加新资料,如果用户选择否则退出该窗体,反之则初始化该窗体,将各文本框的内容清空。 …… If MsgBox("添加学号为" & EditStu(0).Text & "的学生资料成功!是否继续?", vbYesNo) = vbYes Then For i = 0 To 8 EditStu(i).Text = "" Next EditStu(0).SetFocus Else Call Frmstu.ListviewLoad(classid) Unload Me End If …… 如果是修改学生资料,则提示用户修改成功,然后退出该窗体,并更新frmstu窗体中Listview的数据。 …… MsgBox "修改学号为" & EditStu(0).Text & "的学生资料成功!", vbInformation Call Frmstu.ListviewLoad(classid) Unload Me …… 3.3.7 学籍管理模块 该模块包括班级设置、学院/专业设置、课程设置和学生成绩管理四个功能。 在该模块中,我使用了Adodc控件和MSFlexGrid控件来实现其功能。 Adodc控件连接数据库的过程为先定义该对象的ConnectionString属性,在使用Adodc时再定义其RecordSource属性。 Adodc.ConnectionString ="Provider=Microsoft.Jet.OLEDB.4.0; Data Source="& App.Path + "\student.mdb" Adodc.RecordSource="select * fromResult where Name='"&Text1.Text&"' Adodc的使用方法: 添加新记录:Adodc.Recordset.AddNew 修改记录:Adodc1.Recordset.Update 删除记录:Adodc1.Recordset.Delete 3.3.8 报表功能模块 报表设计在实践应用中很有实用性,同样,它也是一项细致的工作,没有太难的算法;当然要使其统计功能做得强大,还要有统计学的理论知识作指导。 此模块很简单,主要实现的是学生信息的预览、打印等功能。 默认的数据报表设计器包含如下内容: 1.报表标头 包含显示在一个报表开始处的文本,例如报表标题、作者或数据库名。如果想把报表标头作为报表的第一页,设置它的ForcePageBreak属性为rptPageBreakAfter。 2.页标头 包含在每一页顶部出现的信息,例如报表的标题。 3.分组标头/注脚 包含数据报表的一个“重复”部分。每一个分组标头与一个分组注脚相匹配。标头和注脚对与数据环境设计器中的一个单独的command对象相关联。 4.细节 包含报表的最内部的“重复”部分(记录)。详细部分与数据环境层次结构中最低层的Command对象相关联。 5.页注脚 包含在每一页底部出现的信息,例如页数。 6.报表注脚 包含报表结束处出现的文本,例如摘要信息或一个地址或联系人姓名。报表注脚出现在最后一个页标头和页注脚之间。 Microsoft数据报表设计器(Microsoft Data Report Designer)是一个多功能的报表生成器,以创建联合分层结构报表的能力为特色。同数据源(如数据环境设计器(Data Environment Designer)一起使用),可以从几个不同的相关表创建报表。除创建可打印报表之外,也可以将报表导出到HTML或文本文件中。 使用Data Report根据数据库中的记录来生成报表,需要完成以下步骤: 1.置一个数据源,例如Microsoft数据环境,以访问数据库。 2.设定DataReport对象的DataSource属性为数据源。 3.设定DataReport对象的DataMember属性为数据成员。 4.右键单击设计器,并单击“检索结构”。 5.向每个相应的节添加响应的控件。 6.为每一个控件设定DataMember和DataField属性。 7.运行时,使用Show方法显示数据报表。 至此,整个学籍管理系统开发完成,单击Visual Basic 6.0程序的“文件à“生成学籍管理系统.exe”,将该数据库程序编译生成可执行程序学籍管理系统.exe。对此执行文件进行测试,然后利用Visual Basic自带的打包向导工具Package & Deployment Wizard来发布该系统,之后即可利用生成的Setup.exe文件进行学籍管理系统程序的安装。
第四章 心得体会 在毕业设计中,我们遇到的困难很多,在解决它们的同时我又学到了很多,获益非浅,特别是如何分析、建立、开发一个系统。 在一个系统开发的过程中编码不是重要的,重要的是分析系统、建立起系统模型。在分析一个系统前,分析人员必须要对将要开发的系统所涉及到的各方面知识有一个认识,然后将系统的模型建立起来。而且一个成功的软件要符合用户的需要,要以用户为中心,开发出用户想要的软件,而不能自以为是,想当然。 在程序编写中,我认识到软件要有简便的界面,良好的程序风格,完备的文挡。拥有这些条件,程序的可读性才会好,开发的复杂度才能大大减少,修改代码时更加容易下手。 我认为,所谓良好的界面,就是用户需要的界面,力求简便全面。所以设计一个界面时,开发人员必须要了解用户的想法,从用户的角度去设计,当然,开发不能全听用户的意见,在详细分析了系统后,开发人员可以向用户提出一些修改的意见,在双方多次交流后定出程序所需的功能,以决定界面的实现。 在编码中,良好的编程风格与习惯是提高工作效率的一个重要方面,而且良好的编程风格与习惯也是使软件便于维护的基础。那如何是良好的编程风格与习惯呢?我认为主要是程序的模块化、必要的注释和完备的设计文挡三个方面。所谓模块化就是使程序的功能实现分成多个单独的功能模块,而不能在一大段代码中实现多个功能,如果这样做,别的人是非常难读懂你的程序。必要的注释,显而易见是要在程序的编写中加入对程序的说明,原因就是为了别人能读懂你的程序,再一段时间后你自己还能读懂自己的程序。而完备的设计文挡是在系统开发过程中记录下开发的全部过程,拥有它,在以后维护软件时就有依据使维护工作变得简单一些。 总结这次毕业设计给我感受最深的至少有四点: 1.进行软件开发这样的工作,要有恒心,要能静下新来做,而不能浮躁。 2.要遵循软件开发本身的规律和善于吸收已有的经验。 3.要善于同别人交流与合作,善于获取游泳的各种资源。 4.要真真实实饿多查资料,多问,多看。
结束语 经过几个月的毕业设计,本人学会了很多知识,个人的能力有了很大的提高,对Visual Basic 6.0和SQL Server 2000的建设有了更深刻的认识,并用Visual Basic6.0结合SQL Server 2000顺利的开发了这样的一个学籍管理系统,我的毕业设计取得了应有的效果。 在这里,我还要感谢我们的指导老师刘珺老师,他们帮助我解决了设计中的疑难和困惑,为我完成设计提供了极大的帮助。在我遇到问题时他总是耐心的为我们作出解答,并帮我查找相关资料;在我遇到困难时帮助解决了不少的难点,使得系统能及时完成。 刘珺老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我受益匪浅,使我得到不少的提高,这对于我以后的工作和学习都有一种巨大的帮助,感谢指导老师耐心的辅导。能够顺利完成毕业课题我们还要感谢计算机科学与技术系,给我们提供了良好实习和设计环境。 本人在此对所有向我提供帮助的老师和同学致以最诚挚的敬意。
参考文献 [1] 抖斗书屋编著, 《Visual Basic6.0常用编程技巧》, 清华大学出版社, 1999年8月; [2] (美)David Jung PierreBoutquin John D.Conley 等编著, 《Visual Basic 6.0 开发人员参考手册》, 2000年1月; [3] 袁鹏飞 孙军安编著,《中文版SQLServer 2000数据库系统管理》, 人民邮电出版社, 2001年5月; [4] 李真文编著,《Visual Basic6.0全实例教程》, 北京希望电子出版社, 2002年6月; [5] 张海藩编著,《软件工程导论》, 清华大学出版社, 2002年1月;
|