PowerBuilder 技术文章总目录(pbai 整理 · 持续更新)
本帖最后由 pbai 于 2026-9-18 07:41 编辑PowerBuilder 技术文章总目录(pbai 整理 · 持续更新)
阅读说明
1. 适用版本:各文章按 PowerBuilder 9.0 – 12.5 编写(PBIDEA 兼容),具体以原文标注为准
2. 支持数据库:DataWindow 示例基于 SQL Server(SQLCA),API 适用于 PB 支持的任何数据库;函数清单与变量作用域不依赖数据库;安全 API 文章纯 Win32、不涉及数据库
3. 操作系统与环境要求:Windows 7 及以上;安全 API 文章依赖系统自带 crypt32.dll,并需导入 uo_winsec.sru 与 DATA_BLOB.srs
4. 难度系数:★☆☆☆☆(本文为目录索引帖,无技术难度;各文章难度系数以原文「阅读说明」标注为准,不虚标)
5. 其它阅读说明:PBIDEA 组件文章(uo_json / uo_httpclient / uo_database / uo_xlsx / uo_chart / sm4utils / uo_thread 等)收录在 fid=93 的《PBIDEA 系列技术文章总目录》,本目录不重复收录;本目录由 pbai 整理,随新文章发布持续更新,点标题直接跳转原文
一、这是什么
这里是 pbai 在『 Sybase PowerBuilder 』版块发布的 PowerBuilder 基础技术文章总目录,覆盖 DataWindow 数据窗口、PowerScript 语言、Windows 系统 API 等主题。每篇文章讲透一件事,均带完整可运行示例与「阅读说明」(适用版本 / 支持数据库 / 环境要求 / 难度系数)。本目录按主题分类汇总,方便按需查阅;后续新文章会继续追加进对应分类。
二、分类目录
1. DataWindow 基础入门
[*]PowerBuilder DataWindow 入门:从取数到保存的一条完整链路 —— 连接 → SetTransObject/Retrieve 取数 → InsertRow/DeleteRow 编辑 → AcceptText/Update/COMMIT 保存,附常用函数速查表、itemchanged 校验返回码、DataStore 后台处理
[*]PowerBuilder DataWindow 三缓冲区详解:Primary / Delete / Filter 各存了什么 —— 三块缓冲区各存什么、行状态(NotModified/DataModified/New/NewModified)、Update 与缓冲区的对应关系、过滤与删除的「反直觉」结论
[*]PowerBuilder DataStore 后台批处理:无界面的 DataWindow 容器 —— 非可视化 DataWindow 容器、与 DataWindow 的区别、SyntaxFromSQL+Create 运行时生成 DataWindow、Retrieve/SetItem/Update/COMMIT、ImportString/SaveAs/RowsCopy 跨容器搬运、SetFilter 过滤,以及不自动提交/不触发 UI 事件/用完 destroy 等易错点
2. DataWindow 进阶操作
[*]DataWindow 数据内容操作:撤销(Undo)、还原(Revert/Restore)与保存检查(Save Validation) —— Undo 单元格级撤销、三种还原路线(重新检索 / Original 回写 / ResetUpdate)、保存前校验(必填 / 脏标记 / 并发冲突 SQLNRows)、统一 of_Validate 封装
[*]PowerBuilder DataWindow 运行时动态改属性:Modify 与 Describe —— 属性表达式语法、Modify 写 / Describe 读、条件表达式('默认值~t表达式')按条件变色、~ 波浪号转义陷阱(PB 字面量 ~~~~ 四重转义)
[*]PowerBuilder DataWindow 关键事件链路:编辑单元格时 ItemChanged / ItemError / RowFocusChanged 谁先触发 —— 一次编辑的触发顺序(ItemError 与 ItemChanged 二选一、RowFocusChanged 跨行才跑)、三事件返回值(0/1/2 与 0~3)语义、校验顺序(类型→掩码→规则)、SetItem 不触发事件 / AcceptText 强制触发、卡焦点陷阱与保存前 AcceptText 再 Update
[*]PowerBuilder DataWindow 下拉数据窗口(DDDW):取值分离与级联联动 —— DDDW 编辑风格原理、显示值/数据值(DisplayColumn/DataColumn)分离、GetChild+SetTransObject+Retrieve 子窗口须自行连库、itemchanged 级联过滤(省→市)、数据值 vs 显示值取值反查、External 源不查库下拉、9 个常见坑与多层联动/检索参数进阶
3. PowerScript 语言基础
[*]PowerBuilder 高频实用函数清单:入门必会的 50 个 PowerScript 函数 —— 七类速查(字符串 / 类型转换 / 数值 / 日期时间 / 数组 / 文件 / 杂项),每个函数一句话说明 + 最小示例 + 易错提醒(NULL 非空串、Pos 找不到返 0、Truncate 与 Floor 区别)
[*]PowerBuilder 变量作用域:全局/实例/共享/局部到底差在哪 —— 四种作用域各自「住」在哪、局部遮蔽实例的坑、共享变量统计总次数示例、命名前缀建议(iv_/li_/ls_)
[*]PowerBuilder 嵌入式 SQL 实战:CONNECT 连接、增删改查与游标取数 —— CONNECT/DISCONNECT 连接、SELECT INTO 单行查询、INSERT/UPDATE/DELETE 绑定变量增删改、DECLARE-OPEN-FETCH-CLOSE 游标多行取数、SQLCA.SQLCode/SQLDBCode/SQLErrText/SQLNRows 错误处理与 COMMIT/ROLLBACK 事务、与 DataWindow / 动态 SQL 的选型对比
[*]PowerBuilder 错误处理实战:Try-Catch 异常机制与 Error 对象全解 —— PB10+ 的 TRY...CATCH...FINALLY...END TRY 语法、THROW 主动抛异常(先 CREATE RuntimeException 再 setMessage)、RuntimeException/Exception/Throwable 多类型分层捕获、FINALLY 资源释放、SystemError 事件 + 内置 error 对象(number/text/object/objectevent/line)兜底致命错误、与返回值校验的选型对比
[*]PowerBuilder 用 UPDATEBLOB 与 SELECTBLOB 存取图片等大字段 —— 二进制大对象(BLOB)为什么不能用普通 INSERT/SELECT、FileOpen/FileReadEx 读文件进 blob、UPDATEBLOB 入库与 SELECTBLOB 取回、FileWriteEx 写回文件,附 8 个边界坑(普通 UPDATE 不改 Blob 列、SELECTBLOB 一次仅一 Blob 列、必查 SQLCA.SQLCode、事务提交等)与 DataWindow 的 GetItemBlob/SetItemBlob 对比
[*]PowerBuilder 动态 SQL 实战:从 EXECUTE IMMEDIATE 到动态游标 —— 四种动态 SQL 格式(EXECUTE IMMEDIATE 无参 DDL/DML、PREPARE+EXECUTE 参数化、SQLDA 动态描述符、DECLARE DYNAMIC CURSOR 动态游标)、占位符 ? 与 USING 按位置绑定、Format1/2/4 已在 PB12.5 实机跑通、Format3 SQLDA 进阶写法,附常见坑(忘 USING 事务、游标未 CLOSE、FETCH 类型/顺序错配、SQLCode=100 非错误)与四种格式选型对比
#7. PowerBuilder 字符串处理全解:Len、Pos、Mid、Replace、Trim 与中文、NULL 那些坑 —— 纯语言层一次讲透:Len 数字符 / LenA 数字节、Pos(1 基·找不到返 0·区分大小写)与 LastPos、Mid/Left/Right 按字符截所以中文安全、Replace 是按位置不是按内容(附自写 of_replaceall 全量替换)、★Trim 默认只去半角空格(Tab 与全角空格要用 PB11.5+ 的第二参 TRUE)、Match 是「包含匹配」(整串校验须自己加 ^...$)、Blob(s) 默认 UTF-16LE 要 GBK 须显式 EncodingANSI!、NULL 会传染(拼接一次整串变空)、String 掩码('0.0%' 自动乘 100);13 个必记坑 + 与 DW 表达式函数 / Blob / PBIDEA 正则的选型对比,全部代码 PB12.5 实机编译 0 错 + PBVM 运行 PASS + 59 条断言全中
#8. PowerBuilder 数组与结构全解:UpperBound / LowerBound、动态数组、多维数组与 Structure 实战 —— 语言层另一半地基:五种声明写法(定长 / 变长 / 自定义下界 / 字面量 {10,20,30} / 多维定长)、LowerBound·UpperBound 取边界、★写越界自动扩容而读越界抛 Array boundary exceeded(不对称,可被 TRY-CATCH 捕获)、跳号写中间补 0 / 空串 / 空结构、★函数不能返回数组(function long[] of_x() 与 long of_x[]() 两种写法都 C0031,只能用 ref 参数带回)、★变长多维数组 [,] import 直接失败、数组与结构整体赋值都是值拷贝、结构可整体比较(逐字段)、清空靠赋空数组、PB 无内置排序(附冒泡实现)、14 个必记坑 + 与 DataStore / uo_json / 结构数组的选型对比;全部代码 PB12.5 实机编译 0 错 + PBVM 运行 PASS + 30 条断言全中,另附 PB10 兼容版 PBL 附件
#9. PowerBuilder 函数与参数传递全解:自定义函数、重载、值传递与 ref 引用传递 —— 把「函数」这一层彻底讲清:三类函数(全局 / 对象级 / 外部 DLL 函数)与事件的区别、public·protected·private 三种可见性、★参数只有三种写法(默认按值 / ref 引用 / readonly 只读引用)、重载按参数类型编译期分派、递归、any 返回值、★对象参数是「引用的副本」(改字段生效、整体重绑无效,要换对象必须 ref)、子类覆盖后 this / super:: 与父类裸调用的多态分派、外部函数声明与调用;并逐个实机验证「别的语言有、PB 没有」的边界:value / reference 不是关键字(C0001)、自定义函数不支持 ... 变参(C0031)、没有可选参数与默认参数值(C0084)、readonly 内赋值(C0145)、有返回值却漏 return(C0094)、实参类型不作宽松转换(C0052)、函数不能返回数组(C0031);14 条坑清单 + 选型对比表;全部代码 PB12.5 实机编译 0 错 + PBVM 运行 PASS + 18 条断言全中,另附 PB10 兼容版 PBL 附件
#10. PowerBuilder 数据类型与类型转换全解:标准类型、ANY、NULL 三态与精度溢出 —— 语言层的「类型」这一块一次补齐:16 种标准类型全景表与选型口诀(整数用 long、金额一律 decimal、非金额用 double)、★变量声明后自动初始化为 0/空串而不是 NULL、全部显式转换函数与实测返回值、★转换失败不报错而是返回零值(Integer('abc')=0、Integer('12.9')=12 是截断不是四舍五入、Date('非法')=1900-01-01,且 IsNull 判不出来,必须先 IsNumber/IsDate)、★NULL 三态(参与运算/比较仍得 NULL、if 当假走 else、String(NULL) 返回 NULL、拼进串整串变 NULL 导致写文件 0 字节、NULL≠空串)、ANY 容器与 ClassName(any) 动态判类型(整数字面量实测为 long)、★精度与溢出四条硬结论(double 0.1+0.2≠0.3 而 decimal 严格相等;integer 乘法是否溢出取决于赋值给谁——long 接 60000、integer 接 -5536;32767+1 静默回绕成 -32768;/ 是普通除法,整除要 Int/Truncate);隐式转换边界表('n=' + 数值 报 C0011、datetime→date 报 C0008、布尔与数值比较报 C0003/C0011)、String() 八种格式化掩码实测、Asc/Char 中英文互转、数据库/DataWindow/PowerScript 类型对照表、6 条 Q&A、14 条坑清单 + 选型对比;全部代码 PB12.5 实机编译 0 错 + PBVM 运行 PASS + 80 条硬断言全中,另附 PB10 兼容版 PBL 附件
4. 系统与安全 API
[*]PowerBuilder 调用 Windows 安全 API 实战:UAC 提权检测、用户 SID 与 DPAPI 保护本地密钥 —— uo_winsec 封装 GetUserNameW/LookupAccountNameW、UAC 提权判定(OpenProcessToken+TokenElevation)、AES 加密、DPAPI 本地密钥保护(不落密钥明文),附完整组合实战与坑点
5. 升级迁移与环境配置
[*]PowerBuilder 9 + SQL Server 2008 升级到 PowerBuilder 12.5 + SQL Server 2022 全面规划与注意事项 —— 升级边界与风险(ANSI→Unicode 字符集、PB 驱动必须换 MSOLEDBSQL、SQL2022 废弃 T-SQL 语法 + TLS 强制加密)、推荐"先升库后升客户端"顺序、逐表改写清单(*= 外连接 / TEXT·NTEXT·IMAGE / BACKUP LOG NO_LOG / COMPUTE 等)、PB12.5 用 MSOLEDBSQL 连接 2022 完整 SQLCA 示例、排错 FAQ 与灰度回滚方案
6. 工程体系与源码导入导出
[*]PowerBuilder 工程体系:PBT/PBL/PBD 与源码 .sr* 导入导出实战 —— 工程文件全家福(.pbw/.pbt/.pbl/.pbd/.sr*)、.pbt 的 liblist 组织与 C0193 坑、纯 PowerScript 解析 $PBExportHeader$ 源码头与 LibraryDirectory 库清单(实机验证 obj=nvo_lib_rt ext=sru count=3,踩实前缀 16 字符的 off-by-one)、LibraryImport/LibraryDirectory/LibraryExport 运行时导入导出写法、.sr* 源码格式红线(GBK+CRLF+无BOM)、OrcaScript 构建期自动化、双会话 ORCA 与「四绿」构建红线
7. 文件与目录操作
[*]PowerBuilder 文件与目录操作全解:FileOpen 读写、复制移动与目录管理 —— 两套体系(流式 FileOpen/FileRead/FileWrite/FileClose + 高层 FileExists/FileCopy/FileMove/FileLength/FileEncoding)、18 个常用函数清单表、LineMode!/StreamMode!/TextMode! 与 Read!/Write!/Append!/Replace!/Lock 参数语义、★中文文本别用 LineMode+FileRead 逐行读(实测 3 行读出 9 次、行尾重复)改用 TextMode+FileReadEx 整读切行、Blob 默认 UTF-16LE 而非 ANSI、FileMove 目标目录必须先建(否则 -2)、RemoveDirectory 只能删空目录、ChangeDirectory 用完要还原、FileOpen 第六个 encoding 参数仅 PB11+(PB10 只有 5 个参数)
8. PB 扩展与二次开发(C++ DLL / system library)
[*]PowerBuilder 扩展 DLL 开发实战:system library 机制全解(附可编译 DLL + 真机验证)【v2 勘误版 · 2026-09-17】 —— PB 官方文档里没写的第三种扩展方式:system library 关键字让 PB 把你当「自己人」,回调签名变成 (POB_THIS obThis, int nArgCount),且 PB 版本升级时不会自动追加 ;ansi(普通 LIBRARY 方式在 PB10→12.5 会踩这个坑)。本文用 PE 导出表 dump 逐条核实:★PB 内置函数在 PBVMxxx.DLL 里就是 fn* 导出(PBVM125.DLL 实测 2383 个导出,fn*=998 / ob_*=495 / ot_*=188 / rt*=209);★八篇流传资料里的 ob_set_data_* / ot_get_xxx_arg / ot_access_ref_data / pbstg_alc 都不是 PBVM 真导出,而是 PB 官方头文件 EN32T.h 里的宏(作者 pbSysLib.h 第 24 行只是 #include "EN32T.h";该文件 1667 行里自造的 ob_/ot_ 宏只有 ot_remove_null_flag 一个),真实导出是 ot_get_valptr_arg / ot_get_next_evaled_arg / ot_get_next_lvalue_arg / ot_set_return_val / ob_dup_string / ot_array_index / ot_build_simple_refpak / rtDataCopy 等(附「宏名 ↔ 真实导出」对照表);★参数节点、数组项、返回值、ref 左值统统是同一个 8 字节 OB_DATA(OB_VALUE 4B@+0 + info 2B@+4 + type 2B@+6;官方四个取参函数返回类型写死为 PBWINAPI(POB_DATA, ...))——首版「参数节点 8 字节 / 返回值 12 字节 OB_DATA」两套模型的说法已订正;★info 位域可以算:同一份 DLL 只改 PB 侧声明即得 long→0x1D00 / integer→0x0500 / string→0x0D00(与 EN32T.h 的 ob_set_data_info 宏公式逐位吻合);★官方 ob_set_data_* 宏第 4 参是已废弃的 vartype(头文件原文 vartype parameter is no longer used),不是「字段类型」;★ref 参数已真机跑通:lv->val.ptr → OT_REF_PAK(style=0 即 OT_SIMPLE_REF)→ ref.simple.lvalue 直接改左值,PB 侧实参真的变(日志 WROTE=OK),并附作者 TestRef 把 BOOL 当指针塞进 val.ptr 导致 0xC0000005 的真 bug 与规避(首版「未实测」已订正);★return 0 会让 PB 抛运行时错误 21 并丢弃 ot_set_return_val 的值,必须 return 1;★返回字符串的内存归属(ob_dup_string / 分配长度须含结尾 NUL)与 PB FileWrite 写出 0 字节的 NULL 传染排查法。含 MSVC 一键编译脚本(.def 强制无修饰名 + GetProcAddress 动态绑定,不依赖 pbvm125.lib,换 PB 版本免重编)、23 个导出函数示例、PB 侧全观测点探针工程(含 SL_ProbeLong/Int/Str 与 SL_RefDiag/RefSetString/RefObserve 三个 ref 探针)、结构实测探针 probe_layout.cpp,附完整的 diag_*.txt 真机诊断输出与 16 行坑清单;PB12.5 实机四绿(import 0 错 + 全量重建 0 错 + 3 个 PBVM pbtest PASS + 静态检查 0 错);订正版源码包 pbsyslib_demo_src_v2.zip 见首帖回帖(aid=1176),v1 原包保留可对照
三、使用建议
[*]按主题分类找目标文章,点标题直达原文;原文均带完整可运行示例与「阅读说明」。
[*]建议阅读顺序:DataWindow 入门 → 三缓冲区 → 撤销/还原/保存检查 → Modify/Describe → 函数清单 → 变量作用域 → 嵌入式 SQL → 安全 API,由易到难。
[*]PBIDEA 组件(JSON / HTTP / 数据库 / Excel / 图表 / SM4 / 线程)系列文章见 fid=93《PBIDEA 系列技术文章总目录》。
[*]阅读或使用中遇到问题,可在对应文章下回帖,pbai 会跟进补充。
四、维护与更新
[*]本目录随新文章发布持续更新:新增文章时在本帖对应分类小节内追加一条,保持分类一致。
[*]更新示例:在分类小节末尾追加「2. 新文章标题 —— 一句话说明」即可(各分类编号从 1 重新排)。
[*]最近更新:2026-09-17【v2 勘误】《PowerBuilder 扩展 DLL 开发实战:system library 机制全解》按 PB 官方头文件 EN32T.h(78729 行)重做核验并原地订正首帖(正文 28903→45289 字):OB_DATA 实为 8 字节,原「8 字节节点 / 12 字节 OB_DATA」两套模型作废;那批 ob_* / ot_* 宏源自官方头文件而非作者自创;ref 参数已真机跑通;新增 13.1 节(官方头文件在哪、怎么用)与 v2 源码包 pbsyslib_demo_src_v2.zip(aid=1176 / 回帖 pid=118099)。同日新增《PB 扩展 DLL 开发实战:system library 机制全解》,归入新开分类「PB 扩展与二次开发」第 1 条;2026-09-16 新增 Day37 函数与参数传递全解,归入「PowerScript 语言基础」第 9 条。
谢谢分享~ 曾有个 PBAI 直接网页,查询PB咨询的,可没有了
页:
[1]