教材征订管理系统课设全解析:数据库设计到PB实现
工试云启 考证服务中心整理

简介本资源为数据库课程设计“教材征订管理系统”完整设计文档适合数据库原理、管理信息系统等课程的本科学生或毕业设计参考。文档从需求分析、数据流图、数据字典入手逐步展开系统总体设计、E-R图、关系图、程序流程图与数据库表结构设计并包含系统测试方法及测试用例覆盖教材征订、入库出库、书费管理、综合查询等模块的完整实现思路。资源为docx格式文档共1个文件大小约651KB内容结构完整可直接作为课程设计报告模板或系统开发蓝本。目前已有686人学习下载适合需要快速理解教材征订业务流程、完成数据库设计文档撰写或开展类似管理信息系统设计的读者参考。1. 教材征订管理系统这套数据库课设到底在解决什么问题做数据库课程设计时最怕的不是写不出代码而是拿到题目后不知道系统该围着哪些数据转。这份《教材征订管理系统》是一份典型的 MIS管理信息系统课设项目完整覆盖了从需求分析、E-R 图设计、数据库建表到 PB 前端实现的全流程核心是围绕教材征订、库存、购买和收款四类信息做增删改查。它选用的技术栈是 SQL Server 2000 PowerBuilder 9.0通过 ODBC 连接数据源前端用 DataWindow 控件实现业务操作。这套组合放到今天看已经偏老但它的业务拆解思路和数据库设计规范对正在做课设的人依然有很强的参考价值——尤其是你如果也在做“XX 管理系统”这类题目读完就能把它的表结构、窗口逻辑和测试方法直接移植到自己的课题上。2. 业务模型与数据库设计四张表怎么撑起教材管理的完整闭环2.1 从数据流图到业务闭环五个环节先理清楚再动手建表拿到这个课题后我一般会先把业务流在白纸上走一遍而不是急着打开 SQL Server 建库。这份课设的数据流图其实已经把系统边界画得很清楚各系统计教材需求量将征订单提交给教材管理部门管理部门据此生成教材计划表再把订书单发给供货单位。供货单位完成供货后教材科做入库登记生成入库单交财务结算。另一边各班级将领书单交到教材科教材科完成出库登记生成出库单交财务同时产生教材费用单。整个闭环里系统需要管理的数据范围就锁定了征订、库存、购买、收款四块信息对应四张业务表。我在复现这个系统时发现它的表设计思路比很多网上流传的课设代码要严谨原因在于它没有把“买书”和“发书”混在一张表里而是用征订号作为贯穿四个环节的业务主键。数据字典部分定义得也比较细致比如“教材编号”被明确为数字型 7 位离散值数据结构、数据处理逻辑、数据存储、数据流四个维度都有对应描述。如果你在写课设报告这套数据字典框架可以直接照搬能帮你把“需求分析”部分的篇幅和质量同时拉满。2.2 四张核心表的结构拆解字段约束和主外键关系是关键四张表的命名很简洁Jcgm教材购买、Jckc教材库存、Jczd教材征订、Sk收款表结构如下表名中文含义关键字段主键说明Jcgm教材购买信息表征订号、书名、出版社、作者、版次、单价、课程、专业、班级、数量、日期征订号记录每一笔教材购买交易Jckc教材库存信息表征订号、书名、出版社、作者、版次、单价、数量征订号库存只关心数量不关心班级和日期Jczd教材征订信息表征订号、书名、出版社、作者、版次、单价、课程、专业、班级、人数、日期征订号征订阶段记录需求人数Sk收款信息表日期、班级、金额日期班级金额字段类型为 Decimal(4,0)按班级维度汇总建表时需要注意区分“人数”和“数量”这两个字段Jczd 登记的是征订阶段的需求人数Jcgm 登记的是实际购买的教材数量Jckc 维护的是库存数量。三个概念如果混在一起后面做统计查询时就很容易翻车。在 SQL Server 2000 里建表的常见写法如下CREATE TABLE Jczd ( zdh CHAR(7) PRIMARY KEY, -- 征订号7位数字型主键 sm VARCHAR(50) NOT NULL, -- 书名 cbs VARCHAR(50), -- 出版社 zz VARCHAR(30), -- 作者 bc VARCHAR(10), -- 版次 dj DECIMAL(6,2), -- 单价 kc VARCHAR(30), -- 课程 zy VARCHAR(30), -- 专业 bj VARCHAR(30), -- 班级 rs INT, -- 人数 rq DATETIME -- 日期 )这段 SQL 的核心约束在于征订号被定义成 CHAR(7) 主键数字型离散值7 位定长。这样做的好处是查询时可以直接用字符串匹配定位征订记录坏处是如果用自增数字做主键后续在 PB 里做 setfilter 时匹配逻辑会变复杂。我复现时选择了保留 CHAR(7) 主键因为原系统的查询按钮就是基于征订号的精确匹配来写的。2.3 从 E-R 图到关系模型出版社、班级和账务之间怎么建立联系E-R 图在这个系统里涵盖了出版社、征订号、书名、作者、版次、单价、日期、数量、购买、班级、专业、金额等实体和属性其中“购买”和“班级”之间的关系是核心一张班级领书单会触发库存扣减和金额结算两条链路的更新这是整个数据模型设计的枢纽。关系图展示的是系统内部的模块关联本质上描述的是同一套数据在不同窗口之间的流转方式。我在整理数据模型时发现一个值得留意的取舍Sk 收款信息表的主键被设计成“日期班级”而不是单独的征订号。这意味着收款是按班级、按日期汇总的一个班级在同一天只能有一条收款记录如果同一天发生两次收款需要合并或者增加新的区分字段。这个设计在实际使用中确实存在边界问题但对于课设答辩来说反而是一个可以主动讲清楚“为什么这么设计”的亮点——你可以说它是按照财务按日对账的习惯来设计的。这一章的核心收获是不要把课设的表结构理解成单纯的“建几张表”而是要把数据流、数据字典、E-R 图和关系模型四者对应起来。答辩时老师问“为什么库存表没有日期字段”你如果能答出“日期不是库存管理的核心维度库存只要知道当前有多少”就已经展示出对数据库设计的理解了。3. 环境搭建与 ODBC 连接SQL Server 2000 和 PowerBuilder 9.0 是怎么对接的3.1 开发环境的组合逻辑为什么是 SQL Server 2000 PB 9.0这套系统的技术选型需要先说明白因为很多人拿到代码后第一步就在环境上卡住了。SQL Server 2000 负责后台数据库的建立与维护PowerBuilder 9.0 负责前端应用程序的开发ACCESS 2000 作为数据源的辅助工具ODBC 负责数据源连接SQL 结构化查询语言实现查询功能。放在当年的教学场景里这个组合非常普遍PB 的 DataWindow 控件对 SQL Server 的适配度高写增删改查的代码量比直接用 MFC 或 VB 少得多而且课设报告里也明确写了“应用程序功能完备、易使用”PB 的窗口化开发模式正好匹配这个目标。但这里有个现实问题SQL Server 2000 在主流 Windows 版本上已经很难安装。我复现时的做法是使用 Windows XP 虚拟机环境或者用 SQL Server 2000 的桌面版配合兼容模式运行。PB 9.0 则相对宽松在 Windows 10 上以管理员身份运行安装程序通常可以完成安装但连接数据库时可能遇到 ODBC 驱动版本不匹配的问题。如果你不想折腾老环境也可以把数据库部分换成 SQL Server Express但那样 ODBC 数据源的配置路径会有差异课设文档里的截图和步骤就对应不上了。提示环境越接近原版越容易按原步骤复现。不建议直接在 Windows 11 上硬装 SQL Server 2000成功率很低。3.2 ODBC 数据源配置把 ACCESS 2000 和 SQL Server 2000 的路打通ODBC 在这套系统里承担的角色比较特别数据源用 ACCESS 2000 开发后台主数据库是 SQL Server 2000ODBC 连接的是 SQL Server 数据源。这个配置流程在控制面板的“管理工具 → ODBC 数据源”里完成打开“ODBC 数据源管理器”选择“系统 DSN”选项卡点击“添加”。选择 SQL Server 驱动输入数据源名称比如jcxt。在“服务器”栏填写本机服务器名称使用 Windows NT 身份验证或 SQL Server 身份验证均可。选择默认数据库为jcgl或你自己建的库名点击“测试连接”确认成功。注意一个细节如果你在 64 位系统上操作需要在C:\Windows\SysWOW64\odbcad32.exe里配置 32 位 ODBC 数据源因为 PB 9.0 是 32 位应用默认的 ODBC 管理器是 64 位的新版两者互不识别。这个坑在第一次搭建时几乎必踩后面避坑章节会详细说。3.3 在 PB 9.0 中配置 sqlca 事务对象连接代码与参数说明PB 连接数据库的标准做法是配置全局事务对象sqlca。在应用的 Application 脚本里写入// Profile jcxt SQLCA.DBMS ODBC SQLCA.DBParm ConnectStringDSNjcxt;UIDsa;PWD123456 CONNECT USING SQLCA; IF SQLCA.SQLCODE 0 THEN MessageBox(连接失败, SQLCA.SQLERRTEXT) RETURN ELSE OPEN(w_login) END IF这段代码的逻辑很直接先指定数据库接口为 ODBC再通过 DSN 名称、用户名和密码构造连接字符串然后执行连接并检查 SQLCODE。如果返回非 0用 SQLERRTEXT 显示具体错误原因连接成功就打开登录窗口。需要特别注意的是PWD参数要和 SQL Server 的登录密码保持一致如果 SQL Server 用的是 Windows 身份验证模式那么 DBParm 里不写UID;PWD而是加上TrustedConnectionyes。我这套配置走通之后登录密码还是原系统写死的sql。也就是说在登录窗口的 EditText 控件里输入sql就能进入主界面。这在课设报告里写得很清楚复现时也省了不少事——如果你只是验证功能不需要改密码逻辑。4. 功能模块实现DataWindow 增删改查的代码逻辑逐段拆解4.1 购买信息窗口 W_gmxx六个按钮背后的完整操作流W_gmxx 是整个系统的核心操作窗口六个按钮分别对应加载、筛选、新增、删除、保存、关闭。原代码我把关键部分整理成如下 PowerBuilder 脚本每一段都能对应到 DataWindow 的标准操作模式。// cb_1加载购买信息 dw_1.settransobject(sqlca) dw_1.retrieve()这两行是 PB 里最基础的 DataWindow 数据加载操作先把事务对象赋给 DW再执行 retrieve 拉取数据。dw_1的 DataWindow 对象必须在设计时已经绑定好 SQL 语句通常是用 SQL SELECT 从 Jcgm 表查询全部字段。如果 retrieve 后没数据先检查是不是连接串错了而不是怪代码写错。// cb_2按征订号筛选 string ls_zdh, ls_filter ls_zdh sle_1.text dw_2.setfilter(zdh ls_zdh ) dw_2.filter() return这段代码的作用是根据用户在输入框sle_1里填写的征订号对dw_2做客户端过滤。setfilter的参数是过滤表达式语法和 SQL WHERE 条件一致filter()真正执行过滤。这个方案只过滤当前窗口已加载的数据不会重新查库速度很快。注意征订号被当做字符串处理所以表达式里要加单引号包裹变量值。// cb_3新增一行 long ll_row ll_row dw_2.insertrow(1) dw_2.scrolltorow(ll_row)insertrow(1)在第一行插入一条空白记录返回新行号scrolltorow把光标滚动到新行上方便用户直接输入数据。此时数据还在 DataWindow 的缓冲区里没有写入数据库必须调用 update 才会真正落库。// cb_4删除当前行 Long li_row li_row dw_2.getrow() If li_row 0 then If MessageBox(删除询问, 真的要删除这条信息吗 ?, question!, YesNo!, 2) 1 Then dw_2.deleterow(li_row) If dw_2.update() 0 Then COMMIT; Else ROLLBACK; MessageBox(错误提示, 无法删除!) End If End If End If这里是 PB 删除操作的经典写法先取当前行号弹确认框确认后调用deleterow删除再update把删除操作提交到数据库。COMMIT和ROLLBACK是事务控制的核心update 失败时必须回滚否则数据状态会不一致。我建议删除操作后加一段刷新代码否则 DataWindow 的选中状态在连续删除时会错乱。// cb_5保存修改 long ll_row dw_2.accepttext() If dw_2.ModifiedCount() 0 Then If dw_2.update() 0 Then COMMIT; Else ROLLBACK; MessageBox(系统提示, 保存失败!请检验数据的正确性) dw_2.setcolumn(1) dw_2.setfocus() End If End If:accepttext()是把用户当前输入框里还没写入缓冲区的文本强制收进 DataWindow 缓冲区这一步经常被漏掉会导致最后一行数据保存不了。ModifiedCount()返回被修改的行数只有大于 0 时才执行 update。保存失败时回滚并提示同时把焦点还给第一列方便用户定位问题。4.2 库存信息窗口 W_kcxx数据清单和单条检索的代码对照W_kcxx 窗口的代码比 W_gmxx 简单但作用很关键。它解决了“看全部库存”和“查特定图书”两个场景的需求// cb_1加载全部库存 dw_1.settransobject(sqlca) dw_1.retrieve() // cb_2按征订号筛选 string ls_zdh, ls_filter ls_zdh sle_1.text dw_1.setfilter(zdh ls_zdh ) dw_1.filter() return注意 W_kcxx 里筛选操作作用于dw_1而不是dw_2说明这个窗口只有一个 DataWindow 控件加载和筛选是对同一份数据做的。这样实现的好处是省了一个控件坏处是每次筛选后记录数会变少如果想重新看全部数据得重新点一次加载按钮。部分 PB 开发者会再加一个“清除筛选”按钮执行dw_1.setfilter()和dw_1.filter()来恢复全量显示。这套库存查询功能放在课设里已经足够但如果要应用到生产环境我会建议把手输征订号改成下拉选择减少输错概率。4.3 征订与收款模块的参数联动从需求人数到实际金额的数据传递征订和收款是教材管理链条的两端中间隔着采购入库。系统里 Jczd 表记录征订需求含人数Jcgm 表记录实际购买含数量和日期Sk 表记录收款含班级和金额。三张表通过征订号或班级编号关联但课设代码里并没有复杂的联动逻辑——它把关联动作放在数据库层面的外键约束和业务规则的说明里。这意味着你在操作界面上的录入顺序应当是先在征订窗口录计划再在购买窗口录实际购买最后在收款窗口录金额。如果跳过了中间步骤数据虽然在三个窗口里都有记录但会存在无法对上账的风险。收款信息表 Sk 的金额字段被定义成Decimal(4,0)即最多 4 位整数、0 位小数。从业务角度讲这个精度设置偏紧实际收款金额往往需要到角分。我复现时会改成DECIMAL(8,2)否则单价 28.50 元的教材在收款表里会被舍入成 29 元。课设代码里没提这个坑但如果你要拿去演示这个字段的偏差会在最后的费用统计报表里暴露出来。代码实现上征订和收款窗口可以参考 W_gmxx 的结构加载、查询、新增、删除、保存、关闭六个按钮完全复用。需要改的只有 DataWindow 对象的 SQL 以及过滤表达式里的字段名。这种模块化的窗口设计正是 PB 开发的通用思路——写一个标准窗口模板然后换 DataWindow 对象复用。注意修改字段精度后如果已经有历史数据直接改表结构可能导致数值溢出。先备份数据再改比较稳妥。5. 避坑指南PB 9.0 SQL Server 2000 开发中的五条血泪记录5.1 64 位系统下 ODBC 数据源“消失”现象在控制面板里配置好的 ODBC 系统 DSN打开 PB 9.0 后连接时提示“找不到数据源名称”但在 ODBC 管理器里明明能看到。原因PB 9.0 是 32 位应用读取的是 32 位 ODBC 配置而 Windows 10/11 默认打开的是 64 位 ODBC 管理器两边数据不互通。解决用C:\Windows\SysWOW64\odbcad32.exe重新配置数据源。如果用的是 32 位系统则不存在这个问题。5.2 DataWindow 能显示数据却无法 update现象retrieve()能正常查出数据但执行update()时报错或没有反应。原因DataWindow 对象的 Update Properties 没有正确设置。默认情况下PB 只允许基于单表的 DataWindow 直接更新如果你在 SQL 里做了多表 JOINPB 会禁止写入必须手动指定更新表和主键列。解决右键 DataWindow 控件选择“Update Properties”把“Allow Updates”勾上Table 改为对应表并在 Unique Key Column(s) 中勾选征订号字段。5.3 中文乱码现象界面里输入中文后SQL Server 里存成乱码或者查询时显示问号。原因SQL Server 2000 的默认排序规则如果是 SQL_Latin1_General_CP1_CI_AS对中文支持不完整ODBC 连接字符串里也缺少字符集声明。解决建库时选择 Chinese_PRC_CI_AS 排序规则ODBC 的 DBParm 中增加CharSetgb2312最后检查窗口字体是否支持中文显示。5.4 连续删除多行时删错数据现象在 DataWindow 中连续删除多条记录最后发现删掉的行不对。原因删除一条后当前行号没有刷新getrow()返回的还是删除前的行号导致下一次删除定位偏移。解决每次删除后调用dw.selectrow(0,false)清除全部选中状态再重新定位到下一行。原代码的dw_2.getrow()之后有一个If li_row dw_2.rowcount()的判断这个判断需要在删除后重新获取行号才有效。5.5 最后一行数据保存时丢失现象键盘输入完最后一行的数据光标还没离开编辑框就点“保存”结果最后一条记录没存进去。原因数据还在编辑框内部缓冲区没有被 DataWindow 接收ModifiedCount()统计不到这行。解决在 update 之前必须先调用accepttext()把编辑框内容强制传给 DataWindow 缓冲区。这是 PB 开发中非常经典的一个坑不只是课设项目会遇到。6. 测试方法与验收准备把课设项目变成能答辩的完整成果6.1 黑盒测试用例套用登录、查询、增删改、统计全覆盖原系统的测试章节明确说明使用了黑盒测试法并给出了四个测试用例登录后显示的界面、查询购买信息、检索库存中特定图书、征订查询和详细信息检索。如果你要复现这个课设我建议把测试用例扩展到六个编号测试场景操作步骤预期结果TC01系统登录输入密码 sql进入主功能界面TC02加载购买信息点击 W_gmxx 的加载按钮显示所有购买记录TC03按征订号筛选输入征订号点击筛选只显示对应记录TC04新增购买记录新增一行并填写数据保存后数据出现在列表中TC05删除库存记录选中一行点击删除数据从列表中消失TC06修改征订人数修改数值并保存更新后的数值在重新加载后保持不变白盒测试在这个系统里可以从数据字典层面做检查征订号是否非空、数量是否为正整数、金额是否在合理范围内。课设报告里不需要真的做全套白盒但只要把黑盒用例的结果截图放进报告测试环节就足够扎实了。6.2 把课设报告变成可复现文档数据字典、流程图、说明书怎么配这套资源里最有价值的部分是数据字典和程序流程图。数据字典把数据项、数据结构、数据处理、数据存储、数据流五个维度都定义了这是答辩时回答“表结构为什么这么设计”的底气来源。程序流程图则展示了从登录到操作再到结束的完整逻辑评审时对方会照着图看代码逻辑是否对应。我来整理课设文档时一般会按这个顺序串问题描述 → 数据流图 → 数据字典 → E-R 图 → 关系图 → 程序流程图 → 表结构 → 功能实现代码 → 测试用例 → 使用说明书。原文档基本覆盖了这条链路你只需要把自己的截图替换进去把测试数据换成更典型的教材记录就能产出一份完整的课程设计报告。6.3 把 PB 9.0 代码迁移到新架构的一个可行方向如果你做完课设后想把这个系统的技术栈升级一下最直接的做法是把 PB 的数据窗口替换成 Web 方式。四张表的结构可以直接迁移到 MySQL 或 SQL Server 2019ODBC 换成连接池或 ORM。DataWindow 的setfilter逻辑对应 Web 端查询表单的 WHERE 条件拼装insertrow对应前端表格的行追加操作updateCOMMIT对应事务性保存接口。整个系统最值得保留的不是代码而是“征订-库存-购买-收款”的闭环数据模型。对我来说拿到一份课设项目的正确打开方式从来不是“跑通就完事”而是强制自己走一遍完整的验收流程复查表结构、核对主外键关系、逐条执行黑盒用例、检查数据字典和代码是否对得上。这套教材征订管理系统真正教给我的不是 PB 的语法而是“先把业务流画明白再动手建表”这个习惯。希望这份拆解能帮你在自己的课设路上少走几个弯路。本文还有配套的精品资源点击获取