第2章学生基本信息管理系统的开发(C级)2.1项目概述2.1.1项目主要功能项目主要功能包含:(1)学生信息管理模块:该模块具体功能是学生基本基本信息的添加、信息修改、删除和查询,排序统计;(2)权限管理模块:该模块主要负责管理用户的信息,区分不同级别的用户,可提高系统安全性;(3)统计及报表;(4)数据管理四个部分。其操作流程如下所示:2.1.2程序文件结构图2-1程序文件结构2.2全局变量和数据库设计2.2.1定义全局变量全局变量的定义:PublicFlagAsInteger登陆是否合法不合法权限判断相应功能操作次数限制PublicusernameAsString这两个变量用来存放登陆用户名和相应等级,定义在标准模块Module1.BAS中。公有函数(可执行SQL语句,返回记录集)的定义:PublicFunctionexesql(ByValsqlAsString)AsADODB.Recordsetsql=Trim$(sql)Setconn=NewADODB.ConnectionSetrst=NewADODB.Recordsetconn.ConnectionString=dsn=student’ODBC数据源名conn.OpenSetrst.ActiveConnection=connrst.LockType=adLockOptimisticrst.CursorType=adOpenKeysetrst.OpensqlSetexesql=rstSetrst=NothingSetconn=NothingEndFunction公有函数亦定义在标准模块Module1.BAS中。2.2.2数据库的设计物理数据库名:studentODBC数据源名:student字段名主键数据类型长度必填默认值CHECK约束说明Sno√char8√学号Snamechar5√姓名Ssexchar2√性别Sbirthdaydatetime8[1/1/1949,1/1/2010]出生日期Sdeptchar20信科系系科Sgradeint4[1,4]年级2.2.1S表(学生基本信息表)字段名主键数据类型长度必填默认值CHECK约束说明username√char8√用户名passwordchar5√密码jibieint2√1等级2.2.2yonghu表(学生基本信息表)2.3效果和关键实现2.3.1登陆模块(窗体名:login)图2-2登陆界面(窗体名:login)关键技术:1、操作数据库的专用函数exesql也应添加到标准模块Module1.BAS中并在VB在VB工程-----引用中添加MicrosoftActiveXDataObjects2.5Library。2、登陆错误次数限制3次不允许用户无止尽尝试密码,一旦错误超过三次程序自动结束,在窗体通用部分首先定义窗体级变量TIM,,核心程序如下:'验证操作员及密码DimsqlAsStringsql=select*fromyonghuwhereusername='+Combo1.Text+'andpassword='+Text2.Text+'Setrs=exesql(sql)Ifrs.RecordCount0ThenLoadmainmain.Showusername=Combo1UnloadMeElseIfTIM=3Then'密码输错3次,退出系统myval=MsgBox(密码输入错误,请向系统管理员查询!,0,)Ifmyval=vbOKThenEndElseMsgBox输入错误,你还有&3-TIM&次机会TIM=TIM+1EndIf3、支持键盘操作,例TEXT2文本框中支持方向键代码如下:PrivateSubtext2_KeyDown(KeyCodeAsInteger,ShiftAsInteger)IfKeyCode=vbKeyReturnThenCmdOk.SetFocus'按回车键CmdOk获得焦点IfKeyCode=vbKeyUpThenCombo1.SetFocusIfKeyCode=vbKeyDownThenCmdOk.SetFocusEndSub4、密码框中输入任何字符以制定字符显示(例“*”),应设置其passwordchar属性的值即可。2.3.2学生信息管理模块(窗体名:main)图2-3学生信息管理界面(窗体名:main)关键技术:1、采用adodc和datagrid显示数据。操作步骤:(1)选中工程-部件(2)Adodc控件完成与各类数据库的连接(连接ODBC数据源student),可执行sql命令(select*froms)。(3)datagrid控件完成数据的显示(指定其DataSource为Adodc控件)。2、记录移动技术首条:Adodc1.Recordset.MoveFirst未条:Adodc1.Recordset.MoveLast上一条(注意应判断是否已移到最前,如果不判断移到第1条记录后再往前移动,程序就出错),关键代码如下:IfNotAdodc1.Recordset.BOFThenAdodc1.Recordset.MovePreviousEndIf下一条(注意应判断是否已移到最后,如果不判断移到第后条记录后再往后移动,程序就出错),关键代码如下:IfNotAdodc1.Recordset.EOFThenAdodc1.Recordset.MoveNextEndIf3、数据删除技术(应判断是否存在记录,否则不存在记录作删除操作程序报错)关键代码如下:IfAdodc1.Recordset.RecordCount0ThenDimssssss=Trim(Adodc1.Recordset.Fields(sno))IfMsgBox(真的要删除[+sss+]吗?,vbYesNo,系统友情提示)=vbYesThenAdodc1.Recordset.DeleteEndIfEndIf4、查询技术:在这里强调标准SQL语句的语法问题,对于字符数据匹配,要加单引号,而对于数值型字段不需要加,例如SNO(char)与text1是否匹配的sql语句为:”select*fromswheresno=’”&text1&”’”,例如Sgrade(int)与text1是否匹配的sql语句为”select*fromswhereSgrade=”&text15、聚集函数的使用(可以给聚集函数起别名),使用方法如下:DimtsqltAsStringsqlt=selectcount(*)as总人数fromswhere&Combo1.Text&Combo2.Text&'&Text1&'Setrs=exesql(sqlt)'调用执行SQL函数,已经在模块中添加Text2.Text=rs(总人数)5、增加修改技术(共用界面update)增加全局变量PublicFlagAsInteger,Flag=0'增加记录,Flag=1'修改记录IfFlag=1ThenCalledit‘调用编辑过程ElseCalladd‘调用增加过程EndIf增加记录时,程序中应考虑主键,空值,check等约束,因此程序中必须增加容错判断,代码如下:Subadd()'注意也可以直接使用insert语句DimsqlAsStringsql=select*fromswheresno='&Text1.Text&'Setrs=exesql(sql)IfText1.Text=OrText2.Text=ThenMsgBox学号姓名不能空ExitSubEndIfIfDTPicker1.Value#1/1/2010#OrDTPicker1.Value#1/1/1949#ThenMsgBox出生日期不合法(1949-1-1~2010-1-1)!ExitSubEndIfIfrs.RecordCount=0Thenrs.AddNewrs(sno)=Text1rs(Sname)=Text2IfOption1.Value=TrueThenrs(Ssex)=男Elsers(Ssex)=女EndIfrs(Sbirthday)=DTPicker1.Valuers(Sdept)=Text3rs(Sgrade)=CInt(Combo1.Text)rs.UPDATEMsgBox增加记录成功ElseMsgBox学号重复无法添加!EndIfEndSub2、编辑记录时,首先加载被编辑的数据到各控件,因此在窗体的相应事件中添加:PrivateSubForm_Load()Combo1.AddItem1Combo1.AddItem2Combo1.AddItem3Combo1.AddItem4IfFlag=1Then'修改数据,首先加载该条数据FLAG全局变量。Text1=main.Adodc1.Recordset.Fields(sno)Text1.Enabled=False'学号无法更改Text2=main.Adodc1.Recordset.Fields(sname)Ifmain.Adodc1.Recordset.Fields(ssex)=男ThenOption1.Value=TrueElseOption2.Value=TrueEndIfDTPicker1.Value=main.Adodc1.Recordset.Fields(sbirthday)Text3=main.Adodc1.Recordset.Fields(sdept)Combo1.Text=main.Adodc1.Recordset.Fields(sgrade)EndIfEndSub具体编辑过程如下:Subedit()'注意也可以直接使用update语句DimsqlAsStringsql=select*fromswheresno='&Text1.Text&'Setrs=exesql(sql)IfText1.Text=OrText2.Text=ThenMsgBox学号姓名不能空ExitSubEndIfIfDTPicker1.Value#1/1/2010#OrDTPicker1.Value#1/1/1949#ThenMsgBox出生日期不合法(1949-1-1~2010-1-1)!ExitSubEndIfrs(Sname)=Text2IfOption1.Value=TrueThenrs(Ssex)=男Elsers(Ssex)=女EndIfrs(Sbirthday)=DTPicker1.Valuers(Sdept)=Text3rs(Sgrade)=CInt(Combo1.Text)rs.UPDATEMsgBox增加更新成功EndSub6,权限限制技术:PrivateSubForm_Activate()'权限判断'1级权限所有权限'等级2:拥有数据查询,增加权限'等级3:拥有数据查询DimsqlAsStringsql=select*fromyonghuwhereusername='&username&'Setrs=exesql(sql)Ifrs(jibie)=2ThenCommand3.Enabled=FalseCommand4.Enabled=FalseElseIfrs(jibie)=3ThenCommand3.Enabled=FalseCommand4.Enabled=FalseCommand5.Enabled=FalseEndIfEndSub7,报表打印技术(在报表中添加相应控件):PrivateSubDataReport_Initialize()Setrs1=exesql(sqltext)SetDataReport1.DataSource=rs1'设置DataReport的数据源DataReport1.Sections(Section1).Controls(text1).DataField=sno’字段名DataReport1.Sections(Section1).Controls(text2).DataField=snameDataReport1.Sections(Section1).Controls(text3).Da