简介:这份资源面向使用 PowerBuilder 9.0 进行企业级应用开发的程序员与学习者,尤其适合需要搭建经典 C/S 架构项目、维护遗留系统或补装开发环境的技术人员。PowerBuilder 9.0 是 Sybase 时期具有代表性的快速应用开发工具,在数据窗口、数据库连接与客户端界面构建方面有独特优势,对希望熟悉这一技术栈的读者具有参考价值。资源以 rar 压缩包形式提供,整体约 1.29MB,体积轻量便于下载与本地留存;上游未提供具体文件清单与类型明细,因此包内构成需以下载后实际内容为准。目前已有 90 人浏览学习,属于小众但定位明确的技术资料。读者可借助它获取 PowerBuilder 9.0 相关的开发环境或配套文件,用于搭建练习环境、对照经典项目结构,或在维护旧系统时快速补齐工具链,从而降低环境准备与上手成本。
1. PowerBuilder 9.0 资源包:一份能直接跑起来的经典 PB 工程拆解
手上这份 PowerBuilder 9.0 资源包,不是那种只有几个空窗口的演示壳子,而是带完整 PBL、数据库脚本和部署说明的工程集合。PB 9.0 在不少存量业务系统里还在服役,尤其是数据窗口密集的报表、单据类应用,维护需求一直没断过。这份资源能解决的核心问题是:给你一个可编译、可连库、可对照的参照工程,省去从零搭环境、猜对象结构的时间。适合两类人——接手老 PB 项目需要快速摸清工程组织的维护者,以及想系统练一遍 DataWindow、PFC 风格代码的开发者。下面按「资源里有什么 → 怎么跑起来 → 哪里会翻车」的顺序拆。
2. 工程结构与运行环境:先把 PBL 和目标文件理清楚
2.1 资源包里的目录与文件类型
拿到包先别急着双击,先看目录。PB 9.0 的工程组织方式和现代 IDE 差别很大,核心单位是 PBL(PowerBuilder Library),一个 PBL 里塞着窗口、菜单、数据窗口、用户对象、函数等对象,编译产物是 PBD 或 EXE。资源包常见结构大致如下:
| 路径/文件 | 作用 | 打开方式 |
|---|---|---|
*.pbw | 工作空间文件,PB 9.0 起用工作空间管理多个目标 | 双击或 IDE 内 Open Workspace |
*.pbt | 目标文件,指向应用对象和 PBL 列表 | 随 pbw 自动加载 |
*.pbl | 对象库,存放窗口/数据窗口/函数 | 在 System Tree 里展开 |
*.pbl对应的*.pbd | 编译后的动态库 | 部署时随 EXE 一起分发 |
*.sql/*.db | 建库脚本或示例库 | 用对应数据库客户端执行 |
readme/deploy.txt | 连接参数、编译顺序说明 | 先读 |
PB 9.0 的工作空间机制是这一版比较明显的变化,早期版本直接开应用,9.0 之后要先开 pbw 再挂 pbt。资源包里如果只有 pbt 没有 pbw,说明是从更老工程迁过来的,需要自己在 IDE 里新建工作空间再把目标加进去,这一步后面避坑章会细说。
2.2 环境准备:PB 9.0 安装与数据库客户端
PB 9.0 是 32 位 IDE,跑在现代 Windows 上要留意兼容性。常见做法是装在 32 位或 64 位系统的兼容模式下,安装时选典型安装即可,关键是 Native Database 接口要勾上——资源包如果连的是 SQL Anywhere 或 SQL Server,对应驱动必须在安装时选中,否则连库那步会直接报「DBMS 未找到」。
数据库侧,先确认资源包 readme 里写的库类型和版本。以 SQL Anywhere 为例,需要先起数据库服务,再在 PB 里配 DB Profile。配连接时几个参数别填错:
Server Name:数据库服务名,不是主机名Database Name:库文件名或库名,视版本而定User ID/Password:示例库常见是dba/sql,以 readme 为准Log ID/Log Pass:一般留空
配好后点 Test Connection,能通再往下走。连不通先别改代码,九成是驱动或服务没起。
2.3 打开工程与首次编译
环境就绪后按这个顺序操作,别跳步:
- 启动 PB 9.0,File → Open Workspace,选资源包里的
*.pbw。 - 左侧 System Tree 展开目标,确认应用对象(Application)存在,双击能看到
Open事件里的启动代码。 - 右键目标 → Properties,检查 Library List 里 PBL 路径是否都是相对路径且指向包内实际位置。路径错位是首次打开最常见的报错来源。
- Build → Rebuild,全量编译一次。看输出窗口有没有 Error,Warning 可以先放。
首次 Rebuild 通过,说明工程结构和依赖基本完整。如果报「Object not found」,多半是某个 PBL 没加进 Library List,或者对象在别的 PBL 里被引用但没一起拷过来。
3. DataWindow 与数据库连接:资源包里最值得对照的部分
3.1 DataWindow 对象的组成与调试入口
PB 的灵魂是 DataWindow,资源包里但凡涉及列表、单据、报表,基本都是 DataWindow 在扛。一个 DataWindow 对象分三层看:Presentation Style(Grid、Freeform、Tabular 等决定外观)、Data Source(SQL 或存储过程决定取数)、Update Properties(决定能不能回写)。调试时我一般先看 Data Source 的 SQL 能不能在数据库客户端里独立跑通,再回来看 PB 里的检索参数。
DataWindow 的取数逻辑通常挂在窗口的Open事件或按钮的Clicked事件里,典型写法:
// 窗口 Open 事件:设置检索参数并取数 long ll_rows dw_1.SetTransObject(SQLCA) // 绑定事务对象 dw_1.Retrieve(ls_dept_id) // 传入部门参数取数 ll_rows = dw_1.RowCount() IF ll_rows = 0 THEN MessageBox("提示", "当前部门无数据") END IFSetTransObject是把 DataWindow 和事务对象SQLCA关联起来,不调这句 Retrieve 会报「未设置事务对象」。Retrieve的参数个数必须和 DataWindow 里定义的检索参数一一对应,多传少传都报错。RowCount用来判断空结果,比直接看界面更可靠。这段逻辑看着简单,但资源包里如果 DataWindow 的检索参数名和代码里传参顺序对不上,就是典型的「能编译、跑起来空数据」问题。
3.2 事务对象与连接池的配置
PB 9.0 里数据库连接靠事务对象,默认是全局SQLCA。资源包如果用了多库或需要重连,会在应用对象的Open事件里初始化连接参数。常见配置:
// 应用对象 Open 事件:初始化 SQLCA SQLCA.DBMS = "ODBC" // 或 SNC、MSS 等,取决于驱动 SQLCA.Database = "demo_db" SQLCA.UserId = "dba" SQLCA.DBPass = "sql" SQLCA.ServerName = "demo_server" SQLCA.AutoCommit = False // 事务手动提交,业务代码里 Commit CONNECT USING SQLCA; IF SQLCA.SQLCode <> 0 THEN MessageBox("连接失败", SQLCA.SQLErrText) HALT CLOSE END IFDBMS要和安装时勾选的接口一致,填ODBC就得先在系统里配好 ODBC 数据源,填SNC走 SQL Anywhere 原生接口。AutoCommit = False意味着所有增删改要显式Commit,资源包里如果某处更新后数据没落库,先查是不是漏了 Commit。SQLCode非 0 时SQLErrText会给出具体原因,比弹个「连接失败」有用得多。
3.3 从资源包反推业务逻辑的读法
拿到一个陌生 PB 工程,别从头读代码。我的顺序是:先看应用对象Open事件搞清启动流程和主窗口,再从主菜单的Clicked事件顺藤摸瓜找到各功能窗口,最后看窗口里 DataWindow 的 SQL 和 Update 属性。资源包如果带菜单对象(m_*),菜单项的事件脚本就是功能地图。这套读法比逐个 PBL 翻对象快得多,也更容易发现资源包里哪些模块是完整实现、哪些只是占位。
4. 避坑与排查:PB 9.0 老工程最容易翻车的五处
4.1 打开工程报「工作空间无效」
现象:双击 pbw 提示工作空间无法加载,或 System Tree 空白。原因多半是 pbw 里记录的 pbt 路径是绝对路径,换机器后失效。解决:用文本编辑器打开 pbw,把 Target 节点里的路径改成相对路径,或在 IDE 里移除目标后重新 Add Target 指向包内 pbt。改完记得另存,别直接覆盖原文件。
4.2 编译通过但运行报「Database profile not found」
现象:Rebuild 无错,运行到连库就弹这个。原因是 PB 的 DB Profile 是 IDE 级配置,不随工程走,换机器就丢。解决:在 IDE 的 Database Profiles 里按 readme 参数重建一个同名 Profile,或者在应用对象里改用代码直接赋SQLCA各属性(如 3.2 的写法),绕开 Profile 依赖。后者更适合要分发的工程。
4.3 DataWindow 显示空白但 RowCount 不为 0
现象:取数成功、行数正常,界面就是空。原因通常是 DataWindow 的列宽为 0、或 Presentation Style 的可见列被隐藏,也可能是字体在当前系统缺失导致渲染异常。解决:在 DataWindow Painter 里检查列的 Width 和 Visible 属性,把字体改成系统通用字体(如宋体)再试。老工程里写死特殊字体的很常见,换机器就翻车。
4.4 中文乱码
现象:界面或数据里中文变问号。原因是数据库字符集、ODBC 驱动编码、PB 区域设置三者不一致。解决:先确认库的字符集,再检查 ODBC 数据源是否勾了正确的代码页,最后看 PB 应用对象里有没有设置SQLCA.DBParm的编码参数。三处对齐基本能解决,只改一处往往没用。
4.5 部署后 EXE 启动即退
现象:IDE 里跑得好,编译成 EXE 分发后一闪而过。原因是运行时缺 PBD 动态库或 PB 运行时 DLL,或者 PBL 没编译进 PBD。解决:确认部署目录里 EXE 同级的 PBD 齐全,PB 运行时文件按部署说明放到位;用Resource方式打包的还要检查 PBR 文件里资源是否列全。这类问题没有报错窗口,只能靠部署清单逐项核对。
5. 进阶:用资源包做一次可验证的改造
资源包的价值不只在「能跑」,更在于拿它做一次小改造来验证自己真的读懂了。我一般会挑一个 DataWindow 做「加检索条件 + 加合计行」的练习:先在 DataWindow 的 SQL 里加一个WHERE参数,回到窗口代码里补Retrieve传参,再在 DataWindow 的 Summary 区加一个sum()计算列。三步走完,取数链路、参数传递、计算列就都过了一遍。
验证改造是否成功,别只看界面。用下面这段代码在按钮里打一次日志,把关键状态落下来:
// 改造验证:记录取数结果与合计值 long ll_rows decimal ld_total dw_1.SetTransObject(SQLCA) ll_rows = dw_1.Retrieve(ls_dept_id) ld_total = dw_1.GetItemDecimal(dw_1.RowCount(), "amount_sum") // 输出到调试窗口或写文件,便于比对 MessageBox("验证", "行数=" + String(ll_rows) + " 合计=" + String(ld_total))GetItemDecimal取的是计算列的值,行号传最后一行即可拿到 Summary 区的合计。行数和合计对得上数据库里直接SELECT COUNT(*), SUM(amount)的结果,改造才算真通过。这一步看着笨,但比肉眼扫界面靠谱得多。
参数边界上还有两个容易忽略的点:检索参数传空字符串和传NULL在 PB 里行为不同,前者可能匹配不到任何行,后者要看 DataWindow 的 SQL 有没有处理IS NULL;计算列的sum()在过滤后只统计当前结果集,不是全表,做报表对账时要分清。这些细节资源包的示例里未必写全,得自己动手试一遍才记得住。
从那以后我每次接手一个 PB 老工程,都强制先跑一遍「Rebuild → 连库 → 打开主窗口 → 点三个核心菜单」这条最小验证链,再动任何代码。链路不通就先修环境,绝不带着环境问题去读业务逻辑,否则排查方向从一开始就是歪的。希望帮到你。
本文还有配套的精品资源,点击获取