☰
教材征订管理系统课设全解析:数据库设计到PB实现
2026/10/12 3:06:04 网站建设 项目流程

简介:本资源为数据库课程设计“教材征订管理系统”完整设计文档,适合数据库原理、管理信息系统等课程的本科学生或毕业设计参考。文档从需求分析、数据流图、数据字典入手,逐步展开系统总体设计、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 2000,ODBC 连接的是 SQL Server 数据源。这个配置流程在控制面板的“管理工具 → ODBC 数据源”里完成:

  1. 打开“ODBC 数据源管理器”,选择“系统 DSN”选项卡,点击“添加”。
  2. 选择 SQL Server 驱动,输入数据源名称,比如jcxt。
  3. 在“服务器”栏填写本机服务器名称,使用 Windows NT 身份验证或 SQL Server 身份验证均可。
  4. 选择默认数据库为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 = "ConnectString='DSN=jcxt;UID=sa;PWD=123456'" 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,而是加上TrustedConnection='yes'。

我这套配置走通之后,登录密码还是原系统写死的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 里做了多表 JOIN,PB 会禁止写入,必须手动指定更新表和主键列。
解决:右键 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 中增加CharSet='gb2312';最后检查窗口字体是否支持中文显示。

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 2019,ODBC 换成连接池或 ORM。DataWindow 的setfilter逻辑对应 Web 端查询表单的 WHERE 条件拼装,insertrow对应前端表格的行追加操作,update+COMMIT对应事务性保存接口。整个系统最值得保留的不是代码,而是“征订-库存-购买-收款”的闭环数据模型。

对我来说,拿到一份课设项目的正确打开方式从来不是“跑通就完事”,而是强制自己走一遍完整的验收流程:复查表结构、核对主外键关系、逐条执行黑盒用例、检查数据字典和代码是否对得上。这套教材征订管理系统真正教给我的,不是 PB 的语法,而是“先把业务流画明白再动手建表”这个习惯。希望这份拆解能帮你在自己的课设路上少走几个弯路。

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

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

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

立即咨询