VB6+Access图书系统:UML建模、三层架构与事务实现
2026/9/18 20:54:16 网站建设 项目流程

简介:本资源是《软件工程》课程设计的完整实践报告,面向高校计算机及相关专业本科生,聚焦图书借阅管理系统的全流程开发与文档化。报告严格遵循软件工程生命周期,涵盖项目计划、结构化分析(含数据流图、数据字典、加工说明、结构图与流程图)、面向对象设计(含用例图、类图、包图、部署图、状态/顺序建模)、VB6.0+Access系统实现、功能界面演示、多阶段测试方案、软件发布说明及总结体会,内容详实、图文并茂,可直接用于课程答辩与工程实践复盘。资源为单个Word文档(.doc),大小421KB,结构清晰、章节完整,便于教学参考与自学研读。目前已有116人学习下载,适合软件工程初学者掌握需求分析、建模设计、编码集成与文档编写的全链路能力。

1. 图书借阅管理系统不是“做个界面+连个数据库”就完事的软件工程课程设计

很多同学拿到“图书借阅管理系统”这个题目,第一反应是打开 Visual Basic 6.0 拖几个 TextBox 和 CommandButton,再用 ADO 连上一个 Access 数据库文件(.mdb),填几条测试数据,点点按钮能增删改查——就以为完成了软件工程课程设计。但现实是:老师翻看你的文档时,真正关注的不是“能不能运行”,而是你是否完整走完了需求分析→系统建模→数据库设计→编码实现→测试验证这一整套工程化流程。尤其当系统要支持多用户并发借阅、图书状态实时同步、逾期自动预警、借阅历史回溯等真实业务逻辑时,Access 的锁机制缺陷、VB6 的内存泄漏风险、缺乏事务回滚能力等问题会立刻暴露。本设计面向高校计算机类专业高年级学生,要求用 VB6 + Access 实现可部署、可验证、有文档支撑的最小可行系统,重点训练 UML 建模能力(用 Microsoft Visio 绘制)、三层结构意识(界面层/业务逻辑层/数据访问层分离)、以及基于 ER 图到关系模式的规范化推导过程——这才是软件工程课程设计的核心交付物。

2. 用 Microsoft Visio 绘制符合软件工程规范的系统建模图谱

2.1 为什么必须用 Visio 而非手绘或截图?

Visio 不是画图工具,而是工程建模语言的载体。课程设计评分细则中明确要求提交“含实体关系图(ERD)、用例图(Use Case Diagram)、类图(Class Diagram)、活动图(Activity Diagram)和系统架构图”的完整模型集。Visio 内置的 UML 模板库(UML Model Diagram)能自动生成符合 OMG 标准的符号语义,例如:用例间的 < > 和 < > 关系必须用带箭头的虚线标注,类图中的聚合关系需用空心菱形+实线连接,而 Visio 会强制校验这些连接线类型与语义的一致性。若用 PowerPoint 或截图拼接,评审时将直接扣减“建模规范性”分项(通常占总分 25%)。更关键的是,Visio 支持反向工程——后续在 VB6 中定义的类模块(Class Module)可导出为 IDL 文件,再导入 Visio 自动生成类图,形成“代码→模型”的闭环验证。

2.2 用 Visio 绘制图书借阅核心 ER 图的实操步骤

提示:ER 图是数据库物理设计的唯一输入源,所有 Access 表结构必须严格按此生成,不可后期随意增删字段。

2.2.1 创建实体与属性

启动 Visio → 新建 → 软件和数据库 → 数据库模型图 → 点击“实体”形状拖入画布。为“图书”实体添加属性:BookID(主键,下划线标识)、ISBNTitleAuthorPublisherPubYearStockCount;为“读者”实体添加:ReaderID(主键)、NameDepartmentPhoneRegisterDate;为“借阅记录”实体添加:BorrowID(主键)、BorrowDateDueDateReturnDate(允许 NULL)。注意:StockCount必须设为整数类型,DueDate需标注“计算规则:BorrowDate + 30 天”。

2.2.2 定义关系并标注基数

用“关系”形状连接“图书”与“借阅记录”,右键关系线 → “格式” → “文本” → 输入“借阅”,再双击关系线打开“关系属性”对话框:左侧实体选“图书”,基数设为“1”,右侧实体选“借阅记录”,基数设为“0..”(表示一本图书可被多次借阅);同理连接“读者”与“借阅记录”,基数设为“1”对“0..”。最终导出为 PNG 时,务必勾选“保持图层信息”,便于答辩时逐层展开讲解。

2.3 从 ER 图到 Access 数据库表结构的映射规则

Visio ER 元素Access 实现方式关键约束说明
主键(下划线属性)在表设计视图中设为“主键”,数据类型选“自动编号”或“文本”BookID必须设为“自动编号”,ReaderID同理;ISBN作为候选键需在“索引”选项卡中新建唯一索引
关系“1 对多”在“借阅记录”表中添加外键字段BookIDReaderID右键字段 → “关系” → 添加参照完整性,级联更新相关字段,但禁止级联删除(防止误删读者导致历史记录丢失)
属性“允许 NULL”字段属性中“允许空”设为“是”ReturnDate必须允许空,否则未归还记录无法插入
计算属性(如 DueDate)不直接建字段,改用查询或 VB6 代码计算在 Access 查询中用DateAdd("d",30,[BorrowDate])生成,避免数据冗余

3. 在 Visual Basic 6.0 中实现三层架构的借阅业务逻辑

3.1 为什么 VB6 必须分层?单窗体代码已不满足课程设计验收标准

VB6 默认项目是“窗体驱动”模式,但课程设计明确要求体现“关注点分离”。若所有 SQL 语句都写在 CommandButton_Click 事件里,将无法通过“业务逻辑可复用性”评审项。正确做法是:新建 3 个 ActiveX DLL 工程(需注册为 COM 组件),分别命名为BLL_Book(业务逻辑层)、DAL_Access(数据访问层)、ENT_Book(实体层)。其中ENT_Book仅包含BookIDTitle等 Public Property,DAL_Access封装OpenConnection()ExecuteQuery()等方法,BLL_Book调用 DAL 并实现CheckStock()CalculateDueDate()等业务规则。这样当未来更换数据库(如迁移到 SQL Server)时,只需重写DAL_Access,上层代码零修改。

3.2 数据访问层(DAL)的关键代码与防错设计

' DAL_Access.cls 中的核心方法 Public Function ExecuteQuery(ByVal sql As String) As ADODB.Recordset On Error GoTo ErrorHandler Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset ' 使用连接字符串而非 DSN,避免环境依赖 conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb;Persist Security Info=False;" conn.Open ' 设置命令超时,防止 Access 锁死 Set rs.ActiveConnection = conn rs.CursorLocation = adUseClient rs.Open sql, conn, adOpenStatic, adLockReadOnly, adCmdText Set ExecuteQuery = rs Exit Function ErrorHandler: ' 记录错误到日志文件,而非弹窗 Open App.Path & "\error.log" For Append As #1 Print #1, Now & " - DAL Error: " & Err.Description & " (Code: " & Err.Number & ")" Close #1 Set ExecuteQuery = Nothing End Function

注意:adOpenStatic游标类型确保数据快照一致性,adLockReadOnly避免 Access 的悲观锁冲突;conn.ConnectionString中的App.Path动态获取程序目录,解决部署时 mdb 文件路径硬编码问题。

3.3 借阅业务逻辑层(BLL)的事务控制实现

' BLL_Book.cls 中的借阅方法 Public Function BorrowBook(ByVal readerID As Long, ByVal bookID As Long) As Boolean Dim conn As New ADODB.Connection Dim cmd As New ADODB.Command Dim rs As ADODB.Recordset On Error GoTo Rollback ' 开启事务 conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb;" conn.Open conn.BeginTrans ' 步骤1:检查库存 Set rs = conn.Execute("SELECT StockCount FROM Books WHERE BookID = " & bookID) If rs.EOF Or rs.Fields("StockCount").Value <= 0 Then conn.RollbackTrans BorrowBook = False Exit Function End If ' 步骤2:插入借阅记录(DueDate = 当前日期+30) cmd.ActiveConnection = conn cmd.CommandText = "INSERT INTO BorrowRecords (ReaderID, BookID, BorrowDate, DueDate) VALUES (?, ?, ?, ?)" cmd.Parameters.Append cmd.CreateParameter("ReaderID", adInteger, adParamInput, , readerID) cmd.Parameters.Append cmd.CreateParameter("BookID", adInteger, adParamInput, , bookID) cmd.Parameters.Append cmd.CreateParameter("BorrowDate", adDate, adParamInput, , Date) cmd.Parameters.Append cmd.CreateParameter("DueDate", adDate, adParamInput, , DateAdd("d", 30, Date)) cmd.Execute ' 步骤3:扣减库存 conn.Execute "UPDATE Books SET StockCount = StockCount - 1 WHERE BookID = " & bookID conn.CommitTrans BorrowBook = True Exit Function Rollback: If conn.State = adStateOpen Then conn.RollbackTrans BorrowBook = False End Function

提示:Access 的 Jet 引擎支持BeginTrans/CommitTrans,但必须使用同一个 Connection 对象执行所有操作;参数化查询(?占位符)杜绝 SQL 注入,这是课程设计“安全性”评分项的硬性要求。

4. Access 数据库的性能优化与常见错误规避策略

4.1 解决 Access “文件锁定”与“并发写入失败”的三重加固

Access 在多用户环境下极易因文件锁导致“数据库已由其他用户以独占方式打开”错误。除常规的OpenDatabase参数设置外,必须实施以下加固:

  1. 连接字符串强制共享模式:在ConnectionString中追加;Jet OLEDB:Database Locking Mode=0(0=乐观锁,1=悲观锁),避免默认的悲观锁阻塞;
  2. Recordset 打开方式优化:所有rs.Open必须指定adOpenForwardOnly+adLockReadOnly,仅在需要更新时才用adOpenKeyset+adLockPessimistic
  3. 物理文件权限隔离:将library.mdb放置于网络共享目录(如\\server\libdb\),客户端程序通过 UNC 路径访问,禁止复制 mdb 到本地 C 盘运行——这是课程设计答辩时高频被问及的部署规范问题。

4.2 针对课程设计场景的 3 个必调 Access 参数表

参数名Access 位置推荐值调整原因
最大缓冲区大小工具 → 选项 → 高级 → “缓冲区大小”1024 KB默认 512KB 在图书检索时易触发磁盘 I/O,调高后提升 LIKE 查询响应速度
默认排序规则工具 → 选项 → 表/查询 → “排序规则”汉字笔画顺序避免ORDER BY Author时出现“张三”排在“李四”前的乱序问题
自动保存间隔工具 → 选项 → 高级 → “自动保存间隔”30 秒防止断电导致借阅记录丢失,但需配合 VB6 层的Application.DoEvents避免界面假死

4.3 规避“Error 1045: Access denied”类权限错误的实操检查清单

虽然课程设计使用本地 Access,但部分同学在调试时会误配 ODBC 数据源指向 MySQL,导致出现类似Error 1045 (28000): access denied for user 'root'@'localhost'的错误。请立即执行以下检查:

  • 在 VB6 代码中搜索所有Provider=字符串,确认值为Microsoft.Jet.OLEDB.4.0(Access)或SQLOLEDB(SQL Server),绝不能出现MySQLProvlibmysql.dll
  • 检查 Windows 控制面板 → 管理工具 → ODBC 数据源,删除所有名称含 “MySQL”、“MariaDB” 的用户 DSN;
  • 若曾安装 Office Tool Plus,需运行其“修复功能”清除残留的 Jet 引擎注册表项(路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines)。

5. 用 Visio 反向工程验证 VB6 类模块与数据库表结构的一致性

5.1 从 VB6 代码生成 Visio 类图的完整流程

Visio 的反向工程功能可将 VB6 的 Class Module 自动转换为 UML 类图,这是验证“代码即设计”的黄金手段。操作步骤如下:

  1. 在 VB6 工程中,确保所有业务类(如clsBookclsBorrow)均保存为.cls文件,且类名与 Access 表名严格对应(clsBookBooks表);
  2. 打开 Visio → 文件 → 导入 → “从 Visual Basic 项目导入” → 选择.vbp工程文件;
  3. 在弹出的向导中,勾选“导入类模块”,取消勾选“导入窗体模块”(窗体不属于业务模型);
  4. Visio 自动生成类图后,右键类 → “属性” → 检查BookID属性是否标记为<<key>>StockCount是否标注类型为Integer—— 若与 ER 图不一致,说明代码与设计脱节,需返工。

5.2 用 SQL 查询交叉验证表结构与 Visio ER 图

在 Access 查询设计视图中,粘贴以下 SQL 并运行,结果必须与 Visio ER 图完全匹配:

SELECT MSysObjects.Name AS TableName, MSysColumns.Name AS ColumnName, IIF(MSysColumns.Flags=2,"PK","") AS KeyType, MSysTypes.Type AS DataType, IIF(MSysColumns.Required=-1,"NOT NULL","NULLABLE") AS Nullability FROM MSysObjects INNER JOIN MSysColumns ON MSysObjects.Id = MSysColumns.Id INNER JOIN MSysTypes ON MSysColumns.Type = MSysTypes.Type WHERE MSysObjects.Type = 1 AND MSysObjects.Flags = 0 ORDER BY TableName, MSysColumns.Ordinal;

提示:该查询读取 Access 系统表,输出每张表的字段名、主键标识、数据类型和空值约束。若结果中Books.StockCountDataType显示为Long Integer(对应 VB6 的Long),而 Visio ER 图标注为Integer,则需在 VB6 实体类中将StockCount As Integer改为StockCount As Long,否则运行时触发类型不匹配异常。

5.3 课程设计文档中必须包含的 4 类验证证据

证据类型生成方式评审关注点
模型-代码一致性报告Visio 反向工程类图 + VB6 类模块源码截图并列排版检查属性名、数据类型、方法签名是否 100% 匹配
数据库-ER 图对照表将 Access 表设计视图截图与 Visio ER 图并列,用箭头标注字段映射重点核查外键字段命名(如BorrowRecords.BookID是否对应Books.BookID
事务日志抽样运行借阅操作后,打开error.log文件,截取含BorrowBook Success的连续 5 行验证事务是否真正提交,而非仅执行 SQL
压力测试记录用 VB6 编写循环脚本,模拟 50 次并发借阅,记录成功率与平均响应时间课程设计虽不要求高并发,但需证明基础事务可靠性

在答辩现场,当老师问“你怎么证明你的设计不是拍脑袋想的”,直接打开 Visio 的反向工程类图,再切换到 Access 查询结果,最后展示 error.log 中的事务成功记录——这三屏证据链,比任何口头解释都更有说服力。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询