初学编程,很多人喜欢从VB入手,可是当拿起一个真正的项目开发时却又没有了头绪。为此,笔者利用自己多年的教学经验和软件开发经验为读者提供了一个简单而又实用的信息管理系统项目。相信,只要你具有VB基础就可以完全理解整个软件开发的思想,并能够触类旁通,完成类似的信息管理系统项目开发。 一、项目需求 1.功能 本案例要求开发人员通过一个界面完成对个人资料的“编号、专业、班级、姓名、班委、爱好”几项信息进行管理。使用功能上要求可以对数据进行“录入、修改、删除、查询、打印”,以及对记录的浏览 “上一条、下一条、第一条、最后一条” 功能。 2.数据 通过个人资料的“编号、专业、班级、姓名、班委、爱好”几项信息我们可以看出,在每一项中包含的都是文本内容,比如编号可以编辑成具有意义的“20050102003”,其中“2005”代表入学年份、“01”代表生源类别、“02”代表班级编号、“003”代表学生的顺序号,虽然“20050102003”看上去是数字,但是在这种不需要运算的情况不需要把它视为“数字”,而应该设为“文本”。“班委”一项只有“是”和“否”两种可能,所以选择其为布尔类型。其他几项设为“文本”类型。 3.界面设计 本项目要求对个人资料的“编号、专业、班级、姓名、班委、爱好”几项信息进行管理,那么在用户界面中就必须有可以控制这六项的地方。在VB中与用户交互的核心对象就是“控件”,那么,控件的选择也就决定了用户使用的灵活性和方便性。 首先,为了让用户知道交互的内容是什么,我们要在窗体中添加六个标签“label”。将其Caption属性依次更改为“编号、专业、班级、姓名、班委、爱好”。在这里可以将这六个“label”做成控件数组,以提高界面加载的效率,当然也可以除了Caption属性外不作任何改动。 其次,为每个标签后面添加一个可与数据库交互的控件。对“编号”而言,由于其编制有特殊要求,故选择文本框“Text”。对于“专业、班级”来说由于可能很多人在一个专业或班级,如果由“Text”输入可能就太麻烦了,故考虑采用具有选择功能的控件,以初学者的经验,常见的是列表框“ListBox”和组合框“ComboBox”。我们比较一下二者的功能,“ListBox”在运行时只具有选择的功能,不能直接添加新的选择项,而“ComboBox”除了具有“ListBox”的功能外还可以在运行时随时添加新的选择项。再看我们的业务需求,专业和班级可能每一学年都有新的变化,有的专业不招生、班级增加、又有新专业了,像这种情况可能会发生,那么,我们就必须在选择控件时考虑到这一点,因此在这里我们选择组合框“ComboBox”。“姓名”这一项数据相同的可能性很小,且无规律可循,毋庸置疑肯定选择文本框“Text”。“班委”这一数据只有“是、否”两个值,我们可以选择单选按钮“Option”或复选框“CheckBox”,由于在这里只用一个“是”值,选中则为“是”,未选中则为“否”,故此处用“Option”或“CheckBox”均可,我们选择用“CheckBox”。“爱好”这一数据无规律可循,但可能包含内容较多,选用文本框“Text”时,要考虑是否能将所有添加的内容显示出来,故在设计此控件时,将其增加水平和垂直方向的滚动条,以便浏览数据的全部内容。 再次,为用户提供功能按钮。根据用户需求信息管理界面要实现数据的“上一条、下一条、第一条、最后一条、录入、修改、删除、查询和打印”的功能要求,选用最简单的命令按钮“Command”。在这里要为用户考虑“查询”功能所需的查询条件。通常情况下,用户可能按专业、班级条件进行查询的时候较多,故单独设置查询窗体,那么在第一个信息管理界面中“查询”按钮功能仅仅是加载一个查询窗体的作用,又由于“打印”的结果通常是在查询完数据后,将查询结果打印出来,故“打印”功能放到查询窗体中。通常窗体操作时要控制自身的卸载,为其添加一个“后退”功能按钮。在第一个信息管理界面中添加九个“Command”,将其Caption属性依次更改为“上一条、下一条、第一条、最后一条、录入、修改、删除、查询和后退”。 根据以上分析,要单独设置查询窗体,具有根据“专业、班级”条件进行查询的功能,并可以打印报表进行输出。由于“专业、班级”两个条件是数据库表中某字段的值,且组合查询情况较多,利用下拉列表选择比较方便,因此在选择控件时“专业”用组合框“ComboBox”,“班级”用列表框“ListBox”。通常情况下,查询后的结果希望能够浏览一下,看一看是否符合用户的要求,考虑添加一个表格控件,将查询结果显示出来,数据只读即可。在设计查询窗体界面时,要添加一个 “MSHFlexGrid”控件。“打印”按钮完成的是将查询结果以表格的形式输出到打印纸上,利用报表可以很方便地实现输出,但是打印的灵活设置又是打印时经常遇到的常规要求,故在这里不对报表进行直接输出而是以“打印预览”的形式输出,再由用户通过调用系统的打印机而灵活设置打印项,如纸张大小、横纵向、页边距等,因此在查询窗体中除了设置“查询”按钮,还设置“打印预览”按钮。 4.程序设计 此项目根据以上需求分析可知,共需要两个窗体文件、一个报表文件。这三个对象中有大量的对数据库操作的需求,考虑采用ADO对象技术,增加模块对象,以方便使用对象。 5.数据库需求 根据项目分析结果,我们发现虽然有两个窗体和一个报表在与数据库交互数据,但是,实际上操作的只有“编号、专业、班级、姓名、班委、爱好”几项信息,而且我们在设计第一个信息管理界面时已将这几项信息安排到了同一个界面中,只需要设计一个表就可以了。 二、数据库设计 建立Access数据库名称为personinfo.mdb;在此数据库中设计数据表PerInfo_tbl; 在表PerInfo_tbl中添加“P_ID、P_SPEC、P_CLASS、P_NAME、P_BW、P_LOVER”六个字段,数据类型全部设成“文本”,同时设置“P_ID”字段为主键。具体设置如表1所示。

三、用户界面设计 1.工程文件的建立 在打开VB应用程序时,选择工程为“数据工程”(数据工程中自动添加一个Form、一个数据环境、一个数据报表,工具箱中自动添加ADODC、DataGrid和MSHFlexGrid表格控件),将Form改名为“frmsys”,然后添加一个窗体改名为“frmquery”,添加一个模块改名为“myModule”,移出数据环境,将数据报表改名为“DRTper9”,然后把工程及工程中的所有文件和数据库“personinfo.mdb”保存在同一个文件夹中。 2.Frmsys窗体的设计 frmsys窗体的设计如图1所示。具体各控件的属性设置如表2所示。

3.Frmquery窗体的设计 查询条件中的专业为Combo1、班级为List1,表格为MSHFlexGrid1,“查询”按钮名称为“Cmdcx”,Index属性为0,“打印预览”按钮名称为“Cmdcx”,Index属性为1,如图2所示。

图1 Frmsys窗体的设计图 图2Frmquery窗体的设计
4.DRTper9报表的设计 数据报表设计如图3 所示,但是要设置DRTper9报表的DataSource属性为空。

图3 DRTper9数据报表的设计 注意在设计报表时取消了“显示网格”和“抓取到网格”的设置,是否设置这几项,取决于设计者的需求。我们考虑可视性和控件位置的布局取消了这两项。 (1)报表数据源的设置 设置报表的DataSource属性值是报表的必须条件,在这里不用绑定的形式,而是用结果集在运行时动态赋值。 (2)报表标头和报表注脚的设计 在报表标头部分添加三个RptLabel(注意:报表中不存在控件数组),分别设置Caption属性值为“个人资料”、“打印日期:”、“第 页”;再添加“当前页码”%p和“当前日期”%D两个控件。在报表注脚部分添加一个RptLabel,设置Caption属性值为“我的第一个报表,成功了!”。添加过程如图4 所示。

图4 报表标头部分设计 (3)页标头和页注脚的设计 在页标头部分添加五个RptLabel,分别设置Caption属性值为“编号”、“姓名”、“专业”、“班级”和“爱好”;再添加八个RptLine控件,拉伸成两条横线和六条竖线。在页注脚部分添加一个RptLabel设置Caption属性值为“共 页”;再添加“总页码”%p控件。 (4)细节部分的设计 在细节部分添加五个RptText,默认情况下显示“非绑定”,分别对应页标头部分的五个RptLabel位置放置着五个控件,然后依次设置其DataField属性值分别为“P_ID 、P_NAME、P_SPEC、P_CLASS、P_LOVER”。 5.myModule模块的设计 在“工程”主菜单中选择“添加模块”子菜单,这时添加模块Module1到工程中。将工程名称改为“myModule”。 6.工程启动对象的设置 在“工程”菜单的“属性”子菜单中设置启动对象为“Sub main”。 四、代码实现 1.myModule模块 公共对象声明及主过程的实现:声明公共连接对象cn、公共记录集对象rs。在Sub main过程中设置连接字符串,并打开连接,同时加载第一个窗体frmsys。 Public cn As New ADODB.Connection '声明公共连接对象cn Public rs As ADODB.Recordset '声明公共记录集对象rs Sub main() '连接对象的字符串赋值,此字符串可用ADO控件生成复制过来,改成相对路径即可 cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _ & App.Path & "\personinfo.mdb;Persist Security Info=False" cn.Open '打开连接 frmsys.Show '加载第一个运行窗体frmsys窗体 End Sub 2.Frmsys窗体 窗体加载事件实现窗体中控件值的初始化,核心代码如下: Private Sub Form_Load() '控件初始化 '清空文本 Text1.Text = "" Text2.Text = "" Text3.Text = "" 'Combo1专业初始化 Combo1.Clear '清空控件中的值 Set rs = New ADODB.Recordset '创建一个新的记录集对象 '通过连接cn、以静态游标只读锁向表中查询P_SPEC字段中不重复的数据,返回到记录集rs中 rs.Open "select distinct P_SPEC from PerInfo_tbl", cn, adOpenStatic, adLockReadOnly If rs.RecordCount > 0 Then '判断记录集中是否有记录 rs.MoveFirst '有记录,将指针指向第一条记录 '循环加载数据值到Combo1中 While Not rs.EOF '判断指针是否到记录尾,若不在记录尾,则向Combo1中添加数据值 Combo1.AddItem rs.Fields(0).Value rs.MoveNext '指针下移一行 Wend End If rs.Close '关闭记录集 Combo2.Clear rs.Open "select distinct P_CLASS from PerInfo_tbl" , cn, adOpenStatic, adLockReadOnly If rs.RecordCount > 0 Then rs.MoveFirst While Not rs.EOF Combo2.AddItem rs.Fields(0).Value rs.MoveNext Wend End If rs.Close '通过连接cn、以键集、更新锁向表中查询所有字段中数据,返回到记录集rs中 rs.Open "select * from PerInfo_tbl", cn, adOpenKeyset, adLockOptimistic ' If rs.BOF = True And rs.EOF = True Then '判断是否有记录 MsgBox "记录集中没有记录!", , "提示" Else rs.MoveFirst '指针移到第一条记录,向控件中依次添加数据 Text1.Text = rs.Fields("P_ID") '编号 Combo1.Text = rs.Fields("P_SPEC") '专业 Combo2.Text = rs.Fields("P_CLASS") '班级 Text2.Text = rs.Fields("P_NAME") '姓名 If rs.Fields("P_BW").Value = True Then '是否班委 Check1.Value = 1 '是班委 Else Check1.Value = 0 End If Text3.Text = rs.Fields("P_LOVER") '爱好 End If End Sub “上一条”按钮单击事件实现记录的向上一条浏览功能,核心代码如下: Private Sub Cmdprivous_Click() If rs.BOF = False Or rs.EOF = False Then '判断记录集是否有记录 If rs.BOF = False Then '判断指针是否在记录头 rs.MovePrevious '指针不在记录头,则将指针向上移一条记录 If rs.BOF = True Then '再次判断指针是否在记录头 MsgBox "已经是第一条记录!", , "提示" Else '指针不在记录头,向控件中依次添加数据 Text1.Text = rs.Fields("P_ID") '编号 Combo1.Text = rs.Fields("P_SPEC") '专业 Combo2.Text = rs.Fields("P_CLASS") '班级 Text2.Text = rs.Fields("P_NAME") '姓名 If rs.Fields("P_BW").Value = True Then '是否班委 Check1.Value = 1 '是班委 Else Check1.Value = 0 End If Text3.Text = rs.Fields("P_LOVER") '爱好 End If End If End If End Sub “下一条”按钮单击事件实现记录的向下一条浏览功能,核心代码如下: Private Sub Cmdnext_Click() If rs.BOF = False Or rs.EOF = False Then '判断记录集是否有记录 If rs.EOF = False Then '判断指针是否在记录尾 rs.MoveNext '指针不在记录尾,则将指针向下移一条记录 If rs.EOF = True Then '再次判断指针是否在记录头 MsgBox "已经是最后一条记录!", , "提示" Else '指针不在记录尾,向控件中依次添加数据 Text1.Text = rs.Fields("P_ID") '编号 Combo1.Text = rs.Fields("P_SPEC") '专业 Combo2.Text = rs.Fields("P_CLASS") '班级 Text2.Text = rs.Fields("P_NAME") '姓名 If rs.Fields("P_BW").Value = True Then '是否班委 Check1.Value = 1 '是班委 Else Check1.Value = 0 End If Text3.Text = rs.Fields("P_LOVER") '爱好 End If End If End If End Sub “第一条”按钮单击事件实现直接浏览到第一条记录的功能,核心代码如下: Private Sub Cmdfirst_Click() If rs.BOF = False Or rs.EOF = False Then '判断记录集是否有记录 rs.MoveFirst '指针移到第一条记录 Text1.Text = rs.Fields("P_ID") '编号 Combo1.Text = rs.Fields("P_SPEC") '专业 Combo2.Text = rs.Fields("P_CLASS") '班级 Text2.Text = rs.Fields("P_NAME") '姓名 If rs.Fields("P_BW").Value = True Then '是否班委 Check1.Value = 1 '是班委 Else Check1.Value = 0 End If Text3.Text = rs.Fields("P_LOVER") '爱好 End If End Sub “最后一条”按钮单击事件实现直接浏览到最后一条记录的功能,核心代码如下: Private Sub Cmdlast_Click() If rs.BOF = False Or rs.EOF = False Then '判断记录集是否有记录 If rs.EOF = False Then '判断指针是否在记录尾 rs.MoveLast '指针移到最后一条记录 Text1.Text = rs.Fields("P_ID") '编号 Combo1.Text = rs.Fields("P_SPEC") '专业 Combo2.Text = rs.Fields("P_CLASS") '班级 Text2.Text = rs.Fields("P_NAME") '姓名 If rs.Fields("P_BW").Value = True Then '是否班委 Check1.Value = 1 '是班委 Else Check1.Value = 0 End If Text3.Text = rs.Fields("P_LOVER") '爱好 End If End If End Sub “录入”按钮单击事件实现将一条新记录写到数据库的表中功能,核心代码如下: Private Sub Cmdaddnew_Click() rs.AddNew '向表中添加一条新记录 rs.Fields("P_ID") = Text1.Text '编号 rs.Fields("P_SPEC") = Combo1.Text '专业 rs.Fields("P_CLASS") = Combo2.Text '班级 rs.Fields("P_NAME") = Text2.Text '姓名 If Check1.Value = 1 Then '是否班委 rs.Fields("P_BW").Value = True '是班委 Else rs.Fields("P_BW").Value = False End If rs.Fields("P_LOVER") = Text3.Text '爱好 rs.Update '数据更新 MsgBox "保存成功!", , "提示" End Sub “修改”按钮单击事件实现将当前一条记录在数据库的表中更新功能,核心代码如下: Private Sub Cmdupdate_Click() rs.Fields("P_SPEC") = Combo1.Text '专业 rs.Fields("P_CLASS") = Combo2.Text '班级 rs.Fields("P_NAME") = Text2.Text '姓名 If Check1.Value = 1 Then '是否班委 rs.Fields("P_BW").Value = True '是班委 Else rs.Fields("P_BW").Value = False End If rs.Fields("P_LOVER") = Text3.Text '爱好 rs.Update '更新当前记录 MsgBox "修改成功!", , "提示" End Sub “删除”按钮单击事件实现将当前记录从数据库的表中删除掉功能,核心代码如下: Private Sub Cmddelete_Click() rs.Delete MsgBox "删除成功!", , "提示" '清空 Text1.Text = "" Text2.Text = "" Text3.Text = "" Combo1.Text = "" Combo2.Text = "" End Sub “查询”按钮单击事件实现加载Frmquery窗体功能,核心代码如下: Private Sub CmdQuery_Click() Frmquery.Show '加载查询窗体 Me.Hide '隐藏当前窗体 End Sub “退出”按钮单击事件实现系统关闭功能,核心代码如下: Private Sub Cmdexit_Click() rs.Close Set rs = Nothing End End Sub 3.Frmquery窗体 窗体加载事件实现窗体中控件值的初始化,核心代码如下: Private Sub Form_Load() Combo1.Clear Set rs = New ADODB.Recordset rs.Open "select distinct P_SPEC from PerInfo_tbl", cn, adOpenStatic, adLockReadOnly If rs.RecordCount > 0 Then Combo1.AddItem "所有专业" rs.MoveFirst While Not rs.EOF Combo1.AddItem rs.Fields(0).Value rs.MoveNext Wend Combo1.ListIndex = 0 End If rs.Close List1.Clear rs.Open "select distinct P_CLASS from PerInfo_tbl", cn, adOpenStatic, adLockReadOnly If rs.RecordCount > 0 Then List1.AddItem "所有班级" rs.MoveFirst While Not rs.EOF List1.AddItem rs.Fields(0).Value rs.MoveNext Wend End If With MSHFlexGrid1 .Rows = 2 .Cols = 7 End With With MSHFlexGrid1 .TextMatrix(0, 1) = "编号" .TextMatrix(0, 2) = "姓名" .TextMatrix(0, 3) = "专业" .TextMatrix(0, 4) = "班级" .TextMatrix(0, 5) = "爱好" .TextMatrix(0, 6) = "是否班委" .ColWidth(6) = 0 End With End Sub 查询、打印预览按钮单击事件实现根据查询条件,预览查询结果,并以报表形式输出,核心代码如下: Private Sub Cmdcx_Click(Index As Integer) Dim i, j, k As Integer Dim strcx As String '查询条件 If Index = 1 Then '打印预览 If Combo1.Text = "所有专业" Then Else strcx = " where P_SPEC='" & Combo1.Text & "'" End If If List1.List(List1.ListIndex) = "所有班级" Then Else If strcx = "" Then strcx = " where P_CLASS='" & List1.List(List1.ListIndex) & "'" Else strcx = strcx & " and P_CLASS='" & List1.List(List1.ListIndex) & "'" End If End If rs.Close rs.Open "select * from PerInfo_tbl" & strcx, cn, adOpenStatic, adLockReadOnly If rs.RecordCount > 0 Then rs.MoveFirst Set DRTper9.DataSource = rs DRTper9.Show End If Else '查询 If Combo1.Text = "所有专业" Then Else strcx = " where P_SPEC='" & Combo1.Text & "'" End If If List1.List(List1.ListIndex) = "所有班级" Then Else If strcx = "" Then strcx = " where P_CLASS='" & List1.List(List1.ListIndex) & "'" Else strcx = strcx & " and P_CLASS='" & List1.List(List1.ListIndex) & "'" End If End If rs.Close rs.Open "select * from PerInfo_tbl" & strcx, cn, adOpenStatic, adLockReadOnly If rs.RecordCount > 0 Then MSHFlexGrid1.Rows = rs.RecordCount + 1 rs.MoveFirst While Not rs.EOF i = i + 1 '改变行值 k = 0 For j = 1 To 6 '给每一行的每一个单元格赋值 MSHFlexGrid1.TextMatrix(i, j) = rs.Fields(k) & "" k = k + 1 Next j rs.MoveNext Wend End If End If End Sub 五、运行效果 运行结果如图5和图6所示。

图5个人信息及根据条件查询结果浏览

图6根据条件打印预览数据 六、代码优化 一个软件项目在能够执行功能以后,还要进行优化和项目性能的综合考虑。比如说,对于经常重复的完全相同的代码,我们可以做成过程或函数,以达到代码重用的目的。在信息管理系统项目中我们要将数据写入表中,将表中的数据进行修改或删除,像这样的操作,要考虑数据是否一致的问题。这就要求在 “录入、修改和删除”的按钮事件中添加事务。利用事务的开始、提交和回滚来控制数据的完整性。在VB中事务是连接对象的方法。而且事务开始后,必须有事务结束和事务回滚相呼应,但是事务结束和事务回滚不能同时执行,要么事务提交成功,要么事务回滚到开始之前的状态。参考代码的基本结构如下: Private Sub Cmdaddnew_Click() On Error GoTo line1 '遇到错误跳转到line1 cn.BeginTrans '事务开始 rs.AddNew '向表中添加一条新记录 rs.Fields("P_ID") = Text1.Text …… rs.Update '数据更新 cn.CommitTrans '事务结束 MsgBox "保存成功!", , "提示" Exit Sub '跳出sub line1: cn.RollbackTrans '事务取消 MsgBox "保存失败!", , "提示" End Sub 七、错误处理 常见的错误分成编译错误、运行时错误和逻辑错误三类。编译错误包括语法错误和由于不正确构造代码而产生的,在编译应用程序时就会检测到这些错误。运行时错误是应用程序在运行(而且被 Visual Basic 检测)期间,当一个语句力图执行一个不能执行的操作时发生。而逻辑错误是在应用程序未按预期方式执行时产生的。从语法角度来看,应用程序的代码可以是有效的,在运行时也未执行无效操作,但还是产生了不正确的结果。应用程序运行的正确与否,只有通过测试应用程序和分析产生的结果才能检验出来。 错误处理程序是应用程序中捕获和响应错误的例程。对于预感可能会出错的任何过程均要对这些过程添加错误处理程序。设计错误处理程序的进程包括三步: 第一步是当错误发生时,通知应用程序在分枝点(执行错误处理例程的地方)设置或激活错误捕获。 VB执行 On Error 语句时激活错误捕获。当包含错误捕获的过程是活动的时候,错误捕获始终是激活的,也就是说,直到该过程执行 Exit Sub、Exit 函数、Exit 属性、End Sub、End 函数或 End 属性语句时,错误捕获才停止。尽管在任一时刻任一过程中只能激活一个错误捕获,但可建立几个供选择的错误捕获并在不同的时刻激活不同的错误捕获。另外On Error GoTo 0 也能停用某一错误捕获。 可用 On Error GoTo line 语句设置一个跳转到错误处理例程的错误捕获,此处,line 指出识别错误处理代码的标签。 第二步是编写错误处理例程。这对所有能预见的错误都做出响应。如果在某些点,控件实际上分支进入捕获,则说捕获是活动的。 书写错误处理例程的第一步是添加行标签,标志着错误处理例程开始。行标签应该有一个具有描述性的名称,其后必须加冒号。有这样一个公共约定,即把错误处理代码放置在过程末端,该过程在紧靠行标签前方处具有 Exit Sub、Exit 函数或 Exit 属性语句。这样,如果未出现错误,则过程可避免执行错误处理代码。 第三步则是退出错误处理例程。Resume 语句使代码后退到语句出错的地方分枝。然后,Visual Basic 再次执行那条语句。如果状态还未变化,则发生另一条错误,而且,执行后退到错误处理例程处分枝。 现将“录入、修改和删除”按钮的功能代码修改如下: “录入”按钮单击事件: Private Sub Cmdaddnew_Click() On Error GoTo line1 '遇到错误跳转到line1 cn.BeginTrans '事务开始 rs.AddNew '向表中添加一条新记录 rs.Fields("P_ID") = Text1.Text '编号 rs.Fields("P_SPEC") = Combo1.Text '专业 rs.Fields("P_CLASS") = Combo2.Text '班级 rs.Fields("P_NAME") = Text2.Text '姓名 If Check1.Value = 1 Then '是否班委 rs.Fields("P_BW").Value = True '是班委 Else rs.Fields("P_BW").Value = False End If rs.Fields("P_LOVER") = Text3.Text '爱好 rs.Update '数据更新 cn.CommitTrans '事务结束 MsgBox "保存成功!", , "提示" Exit Sub '跳出sub line1: cn.RollbackTrans '事务取消 MsgBox "保存失败!", , "提示" End Sub “修改”按钮单击事件: Private Sub Cmdupdate_Click() On Error GoTo line1 '遇到错误跳转到line1 cn.BeginTrans '事务开始 rs.Fields("P_SPEC") = Combo1.Text '专业 rs.Fields("P_CLASS") = Combo2.Text '班级 rs.Fields("P_NAME") = Text2.Text '姓名 If Check1.Value = 1 Then '是否班委 rs.Fields("P_BW").Value = True '是班委 Else rs.Fields("P_BW").Value = False End If rs.Fields("P_LOVER") = Text3.Text '爱好 rs.Update '更新当前记录 cn.CommitTrans '事务结束 MsgBox "修改成功!", , "提示" Exit Sub '跳出sub line1: cn.RollbackTrans '事务取消 MsgBox "修改失败!", , "提示" End Sub “删除”按钮单击事件: Private Sub Cmddelete_Click() On Error GoTo line1 '遇到错误跳转到line1 cn.BeginTrans '事务开始 rs.Delete cn.CommitTrans '事务结束 '清空 Text1.Text = "" Text2.Text = "" Text3.Text = "" Combo1.Text = "" Combo2.Text = "" MsgBox "删除成功!", , "提示" Exit Sub '跳出sub line1: cn.RollbackTrans '事务取消 MsgBox "删除失败!", , "提示" End Sub 八、程序打包 1.编译可执行文件 经过大量的代码调试和软件测试工作后,当项目得到编译许可时,这证明离成功越来越近了。VB的可执行文件的编译是通过“文件”菜单的“生成DataProject.exe”菜单项进行的。在“生成DataProject.exe”菜单项中显示的内容不是固定不变的,究竟生成什么.exe文件,取决于工程名称,如果工程名称叫“信息管理系统”,那么菜单项显示“生成信息管理系统.exe”,而且在编译文件时,会弹出对话框,可以更改exe文件的名称。我们在这里将其名称改为“个人信息管理系统”,同时将这个文件保存在与工程文件相同的路径下。 2.应用程序打包和发布 作为程序员辛辛苦苦做的程序当然不希望将源代码发给客户,当然老板也不会答应,这就需要做一个安装包,然后将包文件进行发布。 在打包前我们先建一个文件夹,名称改为“个人信息管理系统安装包”。然后将工程文件关闭,再利用VB自带的打包向导,进行打包。打包时注意包含文件必须有“个人信息管理系统.exe”和“personinfo.mdb”。发布时只需双击“Setup.exe”文件就可按照安装向导进行安装。 九、结语 通过对个人信息管理系统的分析和讲解,已将利用VB开发数据库程序的必要编程思路讲明了。从项目需求分析到界面设计和数据库设计,从代码实现,到性能优化和错误处理,从编译可执行文件到应用程序的打包和安装注意事项,每个环节均贯穿于项目中,确保了项目的完整性。可以说通过本项目的实践训练,编程初学者就可以在短时间内将零散的知识点完整地牢记在心,并具有了软件项目的整体开发经验。
|