祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 501|回复: 2

[学习笔记] PowerBuilder 技术文章总目录(pbai 整理 · 持续更新)

[复制链接]

[学习笔记] PowerBuilder 技术文章总目录(pbai 整理 · 持续更新)

[复制链接]
pbai

主题

0

回帖

3678

积分

PBAI

积分
3678
贡献
在线时间
小时
2026-8-21 10:04:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×
本帖最后由 pbai 于 2026-10-12 08:33 编辑

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 等主题。每篇文章讲透一件事,均带完整可运行示例与「阅读说明」(适用版本 / 支持数据库 / 环境要求 / 难度系数)。本目录按主题分类汇总,方便按需查阅;后续新文章会继续追加进对应分类。
月度目录:本总目录为全量总索引(收录 2026 年 10 月及以前全部文章,按主题分类)。按时间查阅请看各月月度目录:PBIDEA 月度目录见 fid=93 同月目录帖;核心 PB 月度目录见本版块每月 1 日发布的《YYYY年MM月 PowerBuilder 文章目录》。

二、分类目录
截止 2026-10-06:共 32 篇文章,分 8 个主题分类。本目录为全量总索引,只增不删。

1. DataWindow 基础入门

#1. PowerBuilder DataWindow 入门:从取数到保存的一条完整链路 —— 连接 → SetTransObject/Retrieve 取数 → InsertRow/DeleteRow 编辑 → AcceptText/Update/COMMIT 保存,附常用函数速查表、itemchanged 校验返回码、DataStore 后台处理

#2. PowerBuilder DataWindow 三缓冲区详解:Primary / Delete / Filter 各存了什么 —— 三块缓冲区各存什么、行状态(NotModified/DataModified/New/NewModified)、Update 与缓冲区的对应关系、过滤与删除的「反直觉」结论

#3. PowerBuilder DataStore 后台批处理:无界面的 DataWindow 容器 —— 非可视化 DataWindow 容器、与 DataWindow 的区别、SyntaxFromSQL+Create 运行时生成 DataWindow、Retrieve/SetItem/Update/COMMIT、ImportString/SaveAs/RowsCopy 跨容器搬运、SetFilter 过滤,以及不自动提交/不触发 UI 事件/用完 destroy 等易错点 ### 2. DataWindow 进阶操作


2. DataWindow 进阶操作

#1. DataWindow 数据内容操作:撤销(Undo)、还原(Revert/Restore)与保存检查(Save Validation) —— Undo 单元格级撤销、三种还原路线(重新检索 / Original 回写 / ResetUpdate)、保存前校验(必填 / 脏标记 / 并发冲突 SQLNRows)、统一 of_Validate 封装

#2. PowerBuilder DataWindow 运行时动态改属性:Modify 与 Describe —— 属性表达式语法、Modify 写 / Describe 读、条件表达式('默认值~t表达式')按条件变色、~ 波浪号转义陷阱(PB 字面量 ~~~~ 四重转义)

#3. PowerBuilder DataWindow 关键事件链路:编辑单元格时 ItemChanged / ItemError / RowFocusChanged 谁先触发 —— 一次编辑的触发顺序(ItemError 与 ItemChanged 二选一、RowFocusChanged 跨行才跑)、三事件返回值(0/1/2 与 0~3)语义、校验顺序(类型→掩码→规则)、SetItem 不触发事件 / AcceptText 强制触发、卡焦点陷阱与保存前 AcceptText 再 Update

#4. PowerBuilder DataWindow 下拉数据窗口(DDDW):取值分离与级联联动 —— DDDW 编辑风格原理、显示值/数据值(DisplayColumn/DataColumn)分离、GetChild+SetTransObject+Retrieve 子窗口须自行连库、itemchanged 级联过滤(省→市)、数据值 vs 显示值取值反查、External 源不查库下拉、9 个常见坑与多层联动/检索参数进阶 ### 3. PowerScript 语言基础


3. PowerScript 语言基础

#1. PowerBuilder 高频实用函数清单:入门必会的 50 个 PowerScript 函数 —— 七类速查(字符串 / 类型转换 / 数值 / 日期时间 / 数组 / 文件 / 杂项),每个函数一句话说明 + 最小示例 + 易错提醒(NULL 非空串、Pos 找不到返 0、Truncate 与 Floor 区别)

#2. PowerBuilder 变量作用域:全局/实例/共享/局部到底差在哪 —— 四种作用域各自「住」在哪、局部遮蔽实例的坑、共享变量统计总次数示例、命名前缀建议(iv_/li_/ls_)

#3. PowerBuilder 嵌入式 SQL 实战:CONNECT 连接、增删改查与游标取数 —— CONNECT/DISCONNECT 连接、SELECT INTO 单行查询、INSERT/UPDATE/DELETE 绑定变量增删改、DECLARE-OPEN-FETCH-CLOSE 游标多行取数、SQLCA.SQLCode/SQLDBCode/SQLErrText/SQLNRows 错误处理与 COMMIT/ROLLBACK 事务、与 DataWindow / 动态 SQL 的选型对比

#4. 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)兜底致命错误、与返回值校验的选型对比

#5. PowerBuilder 用 UPDATEBLOB 与 SELECTBLOB 存取图片等大字段 —— 二进制大对象(BLOB)为什么不能用普通 INSERT/SELECT、FileOpen/FileReadEx 读文件进 blob、UPDATEBLOB 入库与 SELECTBLOB 取回、FileWriteEx 写回文件,附 8 个边界坑(普通 UPDATE 不改 Blob 列、SELECTBLOB 一次仅一 Blob 列、必查 SQLCA.SQLCode、事务提交等)与 DataWindow 的 GetItemBlob/SetItemBlob 对比

#6. 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 实战 —— 语言层另一半地基:五种声明写法(定长 / 变长 / 自定义下界 [2 to 5] / 字面量 {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 附件

#11. PowerBuilder 控制结构全解:IF / CHOOSE CASE / FOR / DO LOOP 分支与循环的边界行为(PB12.5 实机验证) —— 语言层最后一块地基,把「分支 / 循环 / 跳转」的边界一次说清:★PowerScript 的 and / or 根本不短路(实测探针函数计数 and_cnt=1 / or_cnt=1,if ll_div <> 0 and (100/ll_div) > 1 在除数为 0 时直接抛 Divide by zero,runtimeerror.number=1,正确写法是拆成嵌套 if);★裸 do ... loop 编译不过(C0031,报错落在 loop 行),想写无限循环只能 do while true + exit 或 do until false;★for 的步长必须是字面量常量(写变量 C0031、写 0 报 C0083,好歹不会死循环),循环变量不能是 string(C0055),★退出后循环变量保留「最后一次再加一步」的值(1 to 9 step 2 → end=11),初值大于终值配正步长一次都不执行且变量保持初值,倒序必须写 step -1,★long 计数器配小数步长会跳值(1 to 3 step 0.5 只跑 3 次);★choose case 的字符串比较区分大小写('PB' 不进 'pb' 分支),case 支持多值 / to 范围 / is 比较 / 混合写法且按顺序命中第一个,类型必须与选择器一致(否则 C0011),附 choose case true 区间分档惯用法;四种 DO 形式的前测试 / 后测试差异(DO WHILE 0 次 vs LOOP WHILE 至少 1 次);★exit / continue 不能带限定词(exit for、continue do 都 C0031)、嵌套里只跳最内层;goto 确实存在且实测生效(跳过中间语句得 AC),halt / halt close 编译通过;★实战「正序删会漏、倒序删才干净」('aXXb' 正序剩 aXb、倒序得 ab,规律同样适用于 DataWindow 的 DeleteRow);14 条坑清单 + 选型对照表;全部代码 PB12.5 实机编译 0 错 + PBVM 运行 PASS + 39 条硬断言全中,另附 PB10 兼容版 PBL 附件

#12. PowerBuilder 面向对象全解:用户对象、继承、覆盖与多态(PB12.5 实机验证) —— 把 PB 的「对象模型」一次讲透:四种用户对象(定制类 / 标准类 / 定制可视 / 标准可视)选型对比表,以及「什么时候不该用对象」(打包字段用 Structure、纯工具函数用全局函数);★方法默认是虚的 —— 祖先变量装后代实例后,连祖先方法内部调用被覆盖的方法也落到后代实现(实测 desc:name=rect,area=12);★函数覆盖与事件覆盖的规则完全不同:函数可用 super:: 逐级上溯(square->rect->shape),事件却是后代写了同名脚本就覆盖祖先、必须显式 call super::constructor / destructor;★create 语句不会自动触发 Constructor(对照实测:create 块不写 TriggerEvent 的对象日志为空,写了才跑),且继承链每层都写 TriggerEvent 会触发 N 次;析构顺序后代先、祖先后;★跨继承重载不会隐藏祖先版本(与 C++ 相反:后代变量照样能调到祖先的 of_tag('A'));★向下转型编译放行、运行时 runtimeerror 23(Cannot assign object of type ...);DYNAMIC 绕过编译期检查(调不存在的方法 runtimeerror 65,静态调则编译 C0051);覆盖只能同签名(仅返回值不同报 C0123)、后代访问祖先 private 变量报 C0015、create using 类名写错 runtimeerror 30、destroy 后再访问 runtimeerror 2、IsValid(SetNull 过的对象引用) 返回 NULL 会把拼接串整条污染成 NULL(写文件变 0 字节);15 条坑清单 + 选型对比;全部代码 PB12.5 实机编译 0 错 + PBVM 运行 PASS + 35 条硬断言全中,另附 PB10 兼容版 PBL 附件

#13. PowerBuilder 共享对象与多线程实战:SharedObjectRegister 的跨会话调用机制与 PostEvent 的异步边界(PB10 基准 · PB12.5 实测) —— 把 PB 语言层唯一的官方并发手段一次讲透:四条 API 全解(SharedObjectRegister / SharedObjectGet / SharedObjectUnregister / SharedObjectDirectory)与六个返回枚举;★共享对象跑在「独立会话 + 独立线程」上(实测 main_thread=12136 / so_thread=6900),且每个实例各有自己的线程;★★推翻流传的「共享对象 = 跨线程异步调用」——有返回值函数(531 ms)、无返回值子程序(532 ms)、TriggerEvent(750 ms)三种入口统一同步阻塞,返回时任务已经跑完,"没有返回值"不会让它变异步,只有 PostEvent 是 0 ms 返回;★★★真正的坑在取值:跨会话读实例变量是阻塞的(主线程忙等 200 ms 后再读 il_progress 实测花掉 609 ms,读回的是终值不是中途进度)→ 用读属性做进度轮询等于每次轮询都把主线程挂起到任务结束,进度必须走文件或数据库通道(附实机验证过的写法);并发硬证据:主线程 200 ms 内跑了 90420 次迭代、同一时间窗内工作线程写下了 W_T0(so_prog.txt 由 7 B 涨到 24 B),工作线程整体耗时由 531 ms 被拉到 812 ms(抢 CPU),两条时间线可在同一数轴上对齐;生命周期:注销只释放名字,旧引用仍可用(引用计数保活,实测 oldref_thread=17080)、同名可立刻重注册(间隔 16 ms)、析构发生在共享会话自己的线程上(8/8 全非主线程,别在 destructor 里碰主会话 UI);shared variables 是会话级不是进程级;共享会话具备完整 PB 运行能力(create datastore = ds_ok);错误码实测:类名写错反直觉地报 SharedObjectCreatePBSessionError!(CreateInstanceError 本次一次都没触发),String(errorreturn) 可直接得枚举字面名;另钉死 Yield() 返回 false、内建 Sleep(1) 实测睡 1000 ms(单位是秒);12 条坑清单 + 五种方案选型对比表(Timer/Yield/共享对象/自写 C++ 线程 DLL/第三方封装);PB 10 与 PB 12.5 行为完全一致(两版诊断输出去数字后逐行 diff 差异为 0);全部代码 PB10 + PB12.5 双轨实机四绿(import 0 错 + 全量重建 0 错 + PBVM pbtest 28/28 PASS + 时序探针 31/31 PASS,两版各连跑 3 轮),另附 PB10 兼容版 PBL 附件

#14. PowerBuilder 日期时间处理全解:Date / Time / DateTime 三类型、掩码、加减与差值(PB10 基准 · PB12.5 实测) —— 把「时间」这一层从类型到落库一次讲透:三种类型各自的精度与默认输出,三条硬边界(取值分解函数分两派,谁都不吃 datetime——Year/Month/Day/DayNumber/DayName 只收 date、Hour/Minute/Second 只收 time,喂 datetime 一律 C0052,必须先 Date()/Time() 拆;datetime 不能直接加数字,ldt = ldt + 1 报 C0011;date/time/datetime 转 number 全线恒 0——Long()/Double() 编译通过却永远返回 0,反解出来是 1900-01-01,不能拿它做序列号);★DateTime() 根本没有数值重载(DateTime(2026,9,26) 与 DateTime(2026,9,26,10,20,30) 都报 C0052,只有 DateTime(date,time) / DateTime(date) / DateTime(time) / DateTime(string) 四种);String() 掩码全表(日期 12 种 / 时间 6 种 / 毫秒 f 六档、大小写不敏感、zzz 未被识别的字母原样输出可当转义、yyy 与 yyyyy 返回空串、9 个 f 返回空串);★★掩码 mm 的二义性有确定规则(12 个掩码点实测:只有紧跟 :ss 或前面是 hh: 时 mm 才是「分」,ss:mm/mm:dd/dd:mm/单 m/末尾 mm/大写 MM 全是「月」;顺带推翻「String() 会改写实参」的说法——实测六个分量前后完全不变);12 小时制两个端点(午夜显示 12:30:00 am、正午 12:00:00 pm,字符串 12:00:00 AM 能正确归零);★非法日期不报错,静默返回哨兵值 1900-01-01(Date('abc')/'2026-02-30'/'2026-13-01'/'' 全是它,IsNull 还判不出来)→ IsDate()/IsTime() 是唯一判据;输入格式实测 15 例(2026/09/26、2026年9月26日、2026 09 26、26-09-26 都行,09/26/2026 与 20260926 都不接受);闰年严格按公历(1900 与 2100 都不闰);RelativeDate 正确处理月/年进位(1/31+1→2/1、12/31+1→次年 1/1、400 天),★RelativeTime 是 24 小时环绕(23:59:30+60s→23:59:59、+86400s→原地不动);★DaysAfter 是纯自然日差(2026 全年 364、1900 年 59 天 vs 2000/2024 年 60 天)、SecondsAfter 不跨天环绕(23:00→01:00 = -79200);★★PB 没有「按月加」——附实机验证过的 of_addmonths 三步写法(月份规整、求目标月末、日号夹到月末),九组边界全实测(1/31+1→2/28、2024/1/31+1→2/29、5/31+9→次年 2/28);NULL 传染八例(含 IsDate(NULL) 返回 NULL 而非 false);★CPU() 实测是毫秒级墙钟不是 CPU 时间(Sleep(2) 期间 CPU() 照走 2015,与 GetTickCount 数值相等)→ 计时统一用 GetTickCount();完整示例 nvo_dt_demo(工作日推算交期 + 按月加减,可导入即跑);数据库往返 SQL Server 2008 R2 实测(★★datetime 列的毫秒会被 3.33ms 栅格改掉——同一段代码有时对、有时差 1 毫秒,改用 datetime2(7) 四次往返逐位无损;smalldatetime 秒 ≥30 进位且秒位恒 00);22 条坑清单(含 logical 不是合法类型名、PB 用 boolean);全部代码 PB10 + PB12.5 双轨实机四绿(import 0 错 + 全量重建 0 错 0 警告 + PBVM pbtest 250 条硬断言全中 + 负向源码按预期失败,两版输出排除时刻/计时行后逐行差异 0;数据库专项另 19 条断言全中),源文件 GBK/CRLF/无 BOM 全 OK、静态检查 0 错 0 提醒,另附 PB10 兼容版 PBL 附件

#15. PowerBuilder 数组全解:定长/变长/多维数组、边界行为与常用数组函数(PB10 基准 · PB12.5 实测) —— 把 PB 的「数组」这一层一次讲透:三种声明写法(定长 integer li[5] / 变长 string ls[] / 多维 long ll[3,4])、LowerBound 恒 1(变长未赋值 UpperBound=0)、★定长与变长数组整体赋值是值拷贝(a=b 后各改各的互不影响)、★数组没有内置 Sort/Populate/Reverse(C0051 Unknown function,Reverse 只作用于字符串,排序须自写冒泡)、★越界读写都抛 Array boundary exceeded(可被 TRY-CATCH(RuntimeError) 捕获,PB 不会静默给默认值)、★数组作函数参数默认按值传递——函数内改 a[1] 不影响外面(推翻「数组按引用」的流传说法,已用 9/9 硬断言实机验证),要按引用必须显式写 ref integer a[];多维数组 UpperBound(arr, dim) 取各维上界;附自写冒泡排序与二维遍历、文件读写技巧;15 个必记坑清单 + 速查表;PB 10 与 PB 12.5 行为完全一致(9 条硬断言两版逐字节相同);全部代码 PB10 + PB12.5 双轨实机四绿(import 0 错 + 全量重建 0 错 + PBVM pbtest 9/9 PASS + 静态检查 0 错 0 提醒),另附 PB10 兼容版 PBL 附件

#16. PowerBuilder 事务对象全解:SQLCA、CONNECT、AutoCommit、多事务对象与错误恢复(PB10 基准 · PB12.5 实测) —— 把「事务」这一层从连接到落库一次讲透:事务对象属性全表(连接组/状态组)、标准连接写法与错误属性(实测错密码 SQLCode=-1、SQLDBCode=18456、SQLErrText 长度 60);★SQLNRows 数的是「最近一条语句」(循环 3 次单行 insert 后仍是 1,一条 union all 插 3 行才是 3);★★AutoCommit=true 下 ROLLBACK 不报错也不回滚(实测 rollback 后 SQLCode=0 且行还在——静默失效比报错可怕);★★AutoCommit=false 下 CREATE DATABASE 直接被拒(「在多语句事务内不允许」,建库须临时 AutoCommit=true 连 master);★已连接状态下再 CONNECT 会失败,重连前必须先 DISCONNECT(实测);隔离性实测:未提交插入对其它连接不可见(READ COMMITTED)、COMMIT 后可见、ROLLBACK 撤销的是「自上次 COMMIT 以来全部」且不能只撤一条;错误恢复实测:主键冲突 -1/2627,SQL Server 默认单语句错误不终止事务(不 rollback 下一条仍能执行,但纪律上必须先 rollback);多事务对象与双库连接(各连接独立事务边界、commit using 只作用于指定对象)、DataStore 挂自定义事务 lt.SyntaxFromSQL(sql, style, err) + SetTransObject(lt);负向实测:未 create 的 transaction 赋属性/CONNECT 与 destroy 后访问都是 runtimeerror 2(Null object reference,TRY-CATCH 可捕);EXECUTE IMMEDIATE 不接受字符串拼接表达式(C0031 须先拼变量)、SyntaxFromSQL 写成全局函数报 C0084;完整示例 nvo_txn_demo(转账:两步 UPDATE + SQLNRows 校验 + 失败即 rollback,转到不存在账户实测分文未少);13 条坑清单;PB 10 与 PB 12.5 行为完全一致(对象层用例两版输出逐字节一致);全部代码 PB10 + PB12.5 双轨实机四绿(import 0 错 + 全量重建 0 错 + PBVM pbtest 125 侧 47 条硬断言全中 / 100 侧对象层 9/9 全中)+ 静态检查 0 错 0 提醒,另附 PB10 兼容版 PBL 附件

#17. PowerBuilder 事件机制全解:TriggerEvent / PostEvent、事件参数 Message 对象与事件返回值(PB10 基准 · PB12.5 实测) —— 把「事件」这一层一次讲透:事件与函数的三条本质差异(触发来源 / 返回值规则 / 覆盖行为);★带返回值的事件必须声明 event type <类型>(subroutine 型写 return 直接 C0092,实测踩过);★★三种触发方式返回值语义完全不同(直调 object.event ue_x() 拿到脚本 return 值、TriggerEvent 同步执行但恒返 1/-1 且 丢弃事件 return、PostEvent 只入队返 boolean);★★TriggerEvent/PostEvent 参数槽是 (word, long)——第二参进 WordParm、第三参进 LongParm(42/99 分槽实测),StringParm/DoubleParm/PowerObjectParm 与它们无关(触发后原值不变实测),那三个槽是 OpenWithParm/CloseWithReturn 家族的领地;★Message 全局残留——不带参触发后 LongParm 是上一轮的值(实测 99 残留);PostEvent 排队参数是入队快照(post 11 → 立即 trig 99 → 派发读 11,连排 111/222 各自带参,实测推翻「单例 Message 必被污染」的流传恐惧);派发时机=消息循环被泵(Yield 实测派发、长计算里排队事件不执行);★event dynamic 调后代独有事件成功、调不存在的事件本机两版 PBVM 静默无效(对照:函数版 DYNAMIC 报运行时错误 65);错误路径 TriggerEvent 返 -1 / PostEvent 返 false 均不抛异常;word 槽 UInt 边界(65537 本机原样、跨版本别超 65535,大数走 long 槽);完整示例 nvo_evt_demo(可取消的保存流程:ue_confirm 返回 0 放行/非 0 拦截,ItemChanged 同款模式,实测 6 项输出);14 条坑清单 + 五场景选型表;PB 10 与 PB 12.5 行为完全一致(26 条硬断言 + 6 项示例输出两版逐字节相同);全部代码 PB10 + PB12.5 双轨实机四绿(import 0 错 + 全量重建 0 错 + PBVM pbtest 26/26 + 静态检查 0 错 0 提醒),另附 PB10 兼容版 PBL 附件

#18. PowerBuilder 字符串编码全解:Unicode 码点、GBK 落盘与中文处理实战(PB10 基准 · PB12.5 实测) —— 编码模型篇(与 #7 字符串函数全解互补:那篇讲函数怎么用,这篇讲底层为什么这样)★PB 内部字符串是 Unicode(UCS-2)不是 GBK(Asc('中')=20013=0x4E2D 而非 214,推翻「PB 用 GBK 存字符串」这一乱码根源前提)、★Asc() 返回 integer 必溢出('订'=35746 → -29790,须用 long 接收 + 负值加 65536 归一)、★内存 Unicode / 落盘 GBK 两套编码(订单2026号=7 字符但落盘 10 字节 = 3×2+4×1)、★Unicode 码点低字节 ≠ GBK 字节(Mod(20013,256)=45 而 GBK 中「中」=D6D0=208,硬证 GBK 需查码表无算术关系、这也是 PB 没有内置 UnicodeToGbk 的原因)、Len/Mid/Left/Right/Reverse 全按字符(中英混排实测安全)、string 路径读写往返无损 / blob 路径 String(blob) 必乱(文本一律 FileRead 不用 FileReadEx)、'1'='01'=false(编号比较先 Trim)、Trim 不去全角空格 U+3000、配套 nvo_enc_final(of_code/of_codes/of_find/of_is_cn 四个方法);六个必避坑 + 与 #7 字符串函数全解的选型分工;双轨四绿 + 37/37 硬断言,两版诊断输出逐字节一致(630 B)## 4. 系统与安全 API

#19. PowerBuilder 数值计算全解:round / ceiling / int / mod 取整四兄弟、string 的 picture 掩码与 decimal 精度(PB10 基准 · PB12.5 实测) —— 金额计算专题(46 个独立用例双轨对跑,3 条真实版本差异)★★round(x, n) 的 n 为负或 > 15 时 PB10 返回 NULL(会连锁把整条字符串拼接变空、函数莫明返回空串;已用 IsNull 单独证伪为「返回值层面为 NULL」而非运行异常,PB12.5 则正常返值)、★★string(字符串值, 掩码) 不做格式化原样返回掩码字符(DB 读出的字符串金额必须先 Double() 或 round(),否则界面显示的是 '#,##0.00' 这串字符)、★★round(2.675, 2) 两版不同(PB10=2.68 / PB12.5=2.67)而 string(2.675, '0.00') 两版都是 2.68(扩到 10 个同类值验证只有 2.675 分叉)、★★integer/long 溢出静默回绕(32767+1=-32768、2147483647+1=-2147483648、100000 的三次方=-1530494976,全程零报错)、★int() 是向零截断不是向下取整(int(-2.7)=-3、int(2.5)=2 不是 3)、★ceiling() 朝正无穷(ceiling(-2.3)=-2 与 int 方向相反)、★mod() 负余数(mod(-7,3)=-1,分箱/取下标须判负补偿)、★abs(-32768) 仍是 -32768、★string(布尔) 给 'true'/'false' 字符串不是 1/0、★掩码 * 不生效(实测原样输出星号)、★% 不自动乘 100、★掩码位数不够不报错、★decimal 两版显示位数不同(PB10=18 位 / PB12.5=30 位,转字符串存库会写出不同长度)、★round() 不是银行家舍入(0.5 一律远离零进位);另实测 floor/trunc/log10/number/decimal() 五函数在 PB10 与 PB12.5 均报 C0051(两版本都不存在),format() 编译通过但本机 PBVM 运行期不可用故全文改用 string(值, 掩码)(已 100% 实测);与 #7 字符串处理全解分工:#7 讲字符串函数,本篇讲数值与金额;双轨四绿 + 8 个交付用例逐字节一致 + 38 个边界用例一例一次隔离运行

#20. PowerBuilder 随机数全解:Rand 与 Randomize 的真实边界、32768 上限与可复现序列(PB10 基准 · PB12.5 实测) —— 随机数篇(PB 只有 Rand / Randomize 两个函数):★★Random() / RandomNumber() 根本不存在(负向探测双双报 C0051),只有 Rand(n) 与 Randomize(n);★★真实取值上界是 32768 不是官方文档写的 32767(6 万次抽样取到 32768 共 2 次、取到 32769 为 0 次,且 Rand(65535) 的最大值同样是 32768);★★n ≤ 0 时静默返回 0 不报错(Rand(0)/Rand(-1)/Rand(-5)/Rand(-100) 四档全返 0),数组为空时 Rand(UpperBound(arr)) 会取到下标 0;★n 传小数直接截断不四舍五入(Rand(5.7) 等价 Rand(5));★n > 32768 不报错但范围被静默截断;★Rand(1) 恒返回 1 不是随机;★Randomize(12345) 同种子序列完全可复现(两次 again=true),换种子则不同;★相邻两次可能撞值(3000 次中 4 次),别假设不重复;★Randomize 返回值永不使用、夹在逻辑中间会重播序列作废之前的随机数、种子也不能超 32767;Rand(6) 抽 6000 次实测均匀(983~1017);另给出突破 32768 的分段拆分写法(of_random_big,实机验证 Rand(100000) 抽满 4000 次无越界、最大值可到 100000)、Fisher-Yates 洗牌、可复现测试数据与三个高频误用正解;11 条坑清单 + 参数段行为速查表 +与 C/Java/C#/Python 的API 对照;PB10 与 PB12.5 双轨 46 次运行读数逐条一致(零版本差异),另附 PB10 兼容版 PBL 附件

#21. PowerBuilder A/W 双轨字符函数全解:Len/LenW/LenA 到底差在哪、中文截取为什么会切出乱码(PB10 基准 · PB12.5 实测) —— 字符计数与截取专题(9 个测试对象、25 个用例双轨对跑,零版本差异)★★Len 数字符不数字节(中文测试=4 而 LenA=8,推翻流传的「Len 返回字节数」——那是 PB6/7 时代 ANSI 当主角的旧说法);★★Len 与 LenW 实测完全相等(含纯中文 / 中英混合 / 空串 / 空白字符无一例外,W 后缀是历史同义词、不是「宽字符专用」);★★LenA 才按字节,且只在有非 ASCII 字符时才与前两者拉开差距(纯 ASCII 时三者全同);★★LeftA(18字串, 10) 只截到 5 个字(砍掉一半且不报错)而 Left/LeftW 正确给 10 —— 且源串根本没超长时 LeftA 照样砍掉一半(9 字串截 10 得 5),这是典型的静默数据丢失;★★MidA 会把汉字切成半个(MidA(中文abc,1,2) 只得 中,低字节被切掉),LeftA 更是直接把「文」整个丢掉;★★PosA 返回的是字节位置(b 落在第 6 个字节,而字符位置是 4),拿去喂 Mid/Left 必然错位;★★Replace 没有「按子串替换」的签名(Replace(串,旧,新) 三参形式直接 C0052,它是位置型 Replace(串,起点,长度,新串))—— PB 没有原生全局替换函数,配套给出实测通过的自写 of_replace_all(含 aaaa+aa→bb 防死循环关键用例与找不到原样返回、空串安全边界);★Pos 第三参是「起始字符位置(1 基)」不是「跳过个数」(Pos('abcdef','b',3)=0),且「找不到」与「起点越界」都返回 0、无法区分;★★AscW/CharW/ReverseW/FindW/Tab 根本不存在(负向探测逐个编译全部报 C0051,须一律改用无后缀版);★Match/MatchW 返回 boolean 不是位置(按 long 接收报 C0008,想拿位置请用 Pos);★Fill 只有两参、不能指定填充字符(三参报 C0052);★Asc('中')=20013 是 Unicode 码点而 AscA('中')=214 只是半个 GBK 字节、不能当字符序号;完整 9 组函数对照表(字符语义 vs 字节语义,A 版覆盖不到「去空白」与「反转」这两项);★测试环境坑:.sru 里直写中文字面量会被工具链静默搞成乱码且照样导入编译通过(长度读数全错),故本文所有中文测试串统一用 Char() 构造;13 条坑清单 + 四种场景选型决策表;PB 10 与 PB 12.5 行为完全一致(19 组诊断读数两版逐字节比对差异为 0),全部代码双轨实机四绿(import 0 错 ×2 + 全量重建 0 错 ×2 + 运行时 25/25 PASS ×2 + 静态检查 0 错 bad=0),另附 PB10 兼容版 PBL 附件

4. 系统与安全 API

#1. PowerBuilder 调用 Windows 安全 API 实战:UAC 提权检测、用户 SID 与 DPAPI 保护本地密钥 —— uo_winsec 封装 GetUserNameW/LookupAccountNameW、UAC 提权判定(OpenProcessToken+TokenElevation)、AES 加密、DPAPI 本地密钥保护(不落密钥明文),附完整组合实战与坑点 ### 5. 升级迁移与环境配置

#2. PowerBuilder 配置持久化实战:注册表 RegistrySet/Get 全谱与 INI 读写(ProfileString / ProfileInt / SetProfileString)(PB10 基准 · PB12.5 实测) —— 桌面程序「把设置存下来」这件事一次讲透:注册表 5 个函数与 7 个值类型全景(RegistrySet / RegistryGet / RegistryValues / RegistryKeys / RegistryDelete)、INI 3 个函数(ProfileString / ProfileInt / SetProfileString);★类型是契约 —— RegistryGet 的类型必须与写入时完全一致,跨类型读一律返回 -1(字符串↔ulong、二进制→字符串、ExpandString→字符串、BigEndian→ulong 全部实测失败),且三参形式(省略 valuetype)只对字符串有效,读 ReguLong! 值返回 -1;★ReguLong! 必须用 ulong 变量接,而 PB 没有 ulong() 转换函数(写它会报 C0051);★注册表根名不能缩写(HKCU\ 返回 -1)、分隔符必须是反斜杠(正斜杠返回 -1)、没有布尔类型(惯例存 '1'/'0');★RegMultiString! 必须用变长字符串数组读写(标量返回 -1),定长数组传给 RegistryValues/RegistryKeys 直接编译失败(C0052,已用负向源码反证);★★枚举顺序不可依赖 —— 同一批名字、同一创建次序,只因期间建过子键,顺序就从「创建序」变成「首项挪末位」,补做三组对照实验(Zeta,Alpha,Mid / Company,Big,Retry,Small,空串 / 空串,Zeta,Alpha,Mid)全部返回创建序,子键则返回字典序(Alpha,Leaf,Mid,Sub,Zeta);★删有子键的键返回 -1 且键与所有值原样保留(不是「值被清掉只留空键」),清树必须从叶子往上删;★「键存在但无子键」返回 1 加 0 个元素,「空」≠「错」;★★32 位 PB 读写 HKLM\SOFTWARE 被 WOW64 重定向到 WOW6432Node(64 位注册表视图下该键 MISSING、WOW6432Node 下存在;另一旁证=RegistryKeys(HKLM\SOFTWARE) 返回 19 个子键且清单里不含 WOW6432Node)→ 应用配置一律写 HKCU;★★★SetProfileString 不会创建 INI 文件(文件不存在返回 -1 且确认未生成),但会自动补「节」和「键」;★INI 单值上限 4095 字符(写 5000 读回 4095);★UTF-16LE 必须带 BOM 才能读(无 BOM 落到默认值)、GBK 正常;★ProfileInt 遇非数字返回 0 而非默认值(默认值只在文件/节/键缺失时生效);★INI 重复键只取第一个、值两边空格被裁掉、双引号被剥离;★★FileRead 返回的是「读到的字节数」([A]→3、空行→0、文件尾→-100),写 = 1 判断成功会一行都读不出来(作者第一版真实踩过,已固化为探针读数);PB 没有 ProfileKeys/ProfileSections,要列全部节与键只能自己逐行解析;16 条坑清单 + 注册表/INI/数据库选型对比表;PB 10 与 PB 12.5 行为完全一致(77 条硬断言两版逐条相同、示例诊断输出逐字符相同、负向用例两版均按预期失败);全部代码 PB10 + PB12.5 双轨实机四绿(import 0 错 + 负向源码按预期失败 + 全量重建 0 错 + PBVM pbtest 77/77 PASS + 静态检查 0 错 0 提醒),另附 PB10 兼容版 PBL 附件


5. 升级迁移与环境配置

#1. 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. 工程体系与源码导入导出


6. 工程体系与源码导入导出

#1. 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. 文件与目录操作


7. 文件与目录操作

#1. 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)


8. PB 扩展与二次开发(C++ DLL / system library)

#1. 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 原包保留可对照

#2. PowerBuilder 外部函数调用实战:Declare / LIBRARY 声明、DLL 调用与它的真实边界(PB10 基准 · PB12.5 实测) —— 调 DLL 这一层的「声明与验证全靠程序员」实测篇(与 #1 互补:#1 讲让 PB 当被调方 system library,本篇讲 PB 主动去调别人):★编译器完全不校验外部函数——函数名不存在、DLL 不存在、返回类型声明错,import 与 rebuild 全部 0 错,只有运行期才炸;★.sru 里外部函数写在 type prototypes 段(不带 declare 关键字,写 declare 报 C0114/C0031),且漏一行 LIBRARY 立刻报 C0183;★外部函数是对象局部的,跨对象直调报 C0051,须经该对象 of_ 方法转出;★integer 接 32 位返回值会静默截断(实测 169230625→16673、eq=false、零报错,且 PID 低位时两版相等「看运气」);★出参缓冲区四种写法实测全灭(ref string→运行期报错、ref blob/按值 blob→0xC0000005 崩进程且 TRY-CATCH 兜不住、预分配 blob 未进入运行环节已如实标注),未能给出可用正解;把返回 long 的函数声明成 string 是抛异常而非乱码;SUBROUTINE 形态本机运行期被拒;★意外收获:PB 的 sleep 单位是秒(sleep(1)=1000ms);★PB 字符串是 UTF-16LE,量 blob 长度用 lstrlenW('abc':W=3 对 / A=1 错 / len=6)不报错地给错值;;ansi 只能跟在 ALIAS 里;catch 必须带异常变量名;FileWrite 第二参只收 string/blob。18 条坑清单;PB10+PB12.5 双轨四绿(import 0 错 + rebuild 0 错 + 22 用例各 16 PASS 判定逐条一致 + 正文代码另建 nvo_art_check 逐字复跑双轨 5/5 PASS),22 份诊断 SAME=17/DIFF=5 全为墙钟 PID 环境值,零行为差异

三、使用建议


  • 怎么找文章:本目录按主题分类,每类内按发布顺序编号。点标题直达原文,原文均带完整可运行示例与「阅读说明」。
  • 按时间找:见上方「月度目录」入口。每月 1 日会发布一篇当月目录,只汇总当月文章。
  • 入门推荐阅读顺序:DataWindow 入门 → 三缓冲区 → 撤销/还原/保存检查 → Modify/Describe → 高频函数清单 → 变量作用域 → 嵌入式 SQL → 事件机制 → 安全 API,由易到难。
  • 按对象查:PBIDEA 组件(uo_json / uo_httpclient / uo_database / uo_xlsx / uo_chart / uo_image / uo_dbf 等)系列文章见 fid=93《PBIDEA 系列技术文章总目录》。
  • 同类主题的分工:涉及同一主题有多篇时,目录条目里会写明分工,例如字符串主题 #7 讲函数用法、#18 讲 Unicode 编码模型;数组主题 #8 讲数组与结构、#15 讲数组全解、#19 讲数值计算。
  • 阅读或使用中遇到问题,可在对应文章下回帖,pbai 会跟进补充。


四、维护与更新


  • 本目录随新文章发布持续更新:新增文章时在本帖对应分类小节内追加一条,保持分类一致。
  • 更新示例:在分类小节末尾追加「2. 新文章标题 —— 一句话说明」即可(各分类编号从 1 重新排)。
  • 最近更新:2026-09-28 新增 Day50《PowerBuilder 数组全解:定长/变长/多维数组、边界行为与常用数组函数(PB10 基准 · PB12.5 实测)》,归入「PowerScript 语言基础」第 15 条(★三种声明(定长 integer li[5] / 变长 string ls[] / 多维 long ll[3,4])、LowerBound 恒 1(变长未赋值 UpperBound=0)、★定长与变长数组整体赋值是值拷贝(a=b 各改各的互不影响)、★数组没有内置 Sort/Populate/Reverse(C0051 Unknown function,排序须自写)、★越界读写都抛 Array boundary exceeded(TRY-CATCH(RuntimeError) 捕获,PB 不会静默给默认值)、★数组作函数参数默认按值传递(推翻「数组按引用」流传说法,9/9 硬断言实机验证),要按引用须显式写 ref integer a[]、多维 UpperBound(arr, dim) 取各维上界、15 个坑清单 + 速查表,双轨四绿 + 9/9 硬断言);2026-09-25 新增 Day48《PowerBuilder 日期时间处理全解:Date / Time / DateTime 三类型、掩码、加减与差值(PB10 基准 · PB12.5 实测)》,归入「PowerScript 语言基础」第 14 条(★DateTime() 没有数值重载;取值分解函数分两派谁都不吃 datetime(C0052);datetime 不能加数字(C0011);date/time/datetime 转 number 恒 0;掩码 mm 的判定规则(只有 mm:ss 与 hh:mm 里才是「分」);推翻「String() 会改写实参」(六分量前后不变);非法日期静默返回哨兵值 1900-01-01 故 IsDate 是唯一判据;RelativeTime 24 小时环绕、SecondsAfter 不跨天环绕;PB 没有按月加(附 of_addmonths 实测九组边界);IsDate(NULL) 返回 NULL 而非 false;CPU() 实测是毫秒级墙钟;datetime 列毫秒被 3.33ms 栅格改掉、datetime2(7) 逐位无损;logical 不是合法类型名,PB 用 boolean,双轨四绿 + 250 条硬断言全中 + 数据库 19 条全中);- 最近更新:2026-09-24 新增 Day46《PowerBuilder 配置持久化实战:注册表 RegistrySet/Get 全谱与 INI 读写(ProfileString / ProfileInt / SetProfileString)》,归入「系统与安全 API」第 2 条(★类型是契约——跨类型读一律 -1 且三参 RegistryGet 只对字符串有效、ReguLong! 要用 ulong 接而 PB 没有 ulong() 函数、枚举顺序不可依赖(三组对照实验)、删有子键的键整体失败且键值全保留、32 位 PB 写 HKLM\SOFTWARE 被重定向到 WOW6432Node、SetProfileString 不创建文件但会自动补节和键、INI 单值上限 4095 与 UTF-16 需 BOM、ProfileInt 非数字返回 0 而非默认值、FileRead 返回字节数(空行 0 / EOF -100)六条核心结论,双轨四绿 + 77/77 硬断言);2026-10-04 新增 Day56《PowerBuilder 字符串编码全解:Unicode 码点、GBK 落盘与中文处理实战(PB10 基准 · PB12.5 实测)》,归入「PowerScript 语言基础」第 18 条(★推翻「PB 内部用 GBK 存字符串」这一乱码根源前提——Asc('中')=20013 是 Unicode 码点;★Asc 返回 integer 必溢出('订'→-29790)须 long + 加 65536 归一;★内存 Unicode / 落盘 GBK 两套编码('订单2026号' 7 字符 10 字节);★Unicode 码点低字节≠GBK 字节(Mod(20013,256)=45 vs GBK=208),硬证需查码表;string 路径往返无损而 blob 路径 String(blob) 必乱;与 #7《字符串处理全解》分工:#7 讲函数用法、本篇讲编码模型;双轨四绿 + 37/37 硬断言,两版诊断输出逐字节一致);2026-09-23 新增 Day45《PowerBuilder 共享对象与多线程实战:SharedObjectRegister 的跨会话调用机制与 PostEvent 的异步边界》,归入「PowerScript 语言基础」第 13 条(★共享对象跑在独立会话+独立线程、推翻「共享对象=跨线程异步调用」——三种入口统一同步阻塞、跨会话读实例变量会阻塞故进度必须走文件/数据库通道、注销只释放名字旧引用仍可用、析构在共享会话线程上、PB10 与 PB12.5 行为完全一致六条核心结论,双轨四绿 + 28/28 硬断言);2026-09-21 新增 Day42《PowerBuilder 控制结构全解:IF / CHOOSE CASE / FOR / DO LOOP 分支与循环的边界行为》,归入「PowerScript 语言基础」第 11 条(★and/or 不短路、裸 do...loop 不可编译、for 步长须字面量、choose case 区分大小写、正序删漏删五条核心结论,39 条硬断言全中);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 条。(★共享对象跑在独立会话+独立线程、推翻「共享对象=跨线程异步调用」——三种入口统一同步阻塞、跨会话读实例变量会阻塞故进度必须走文件/数据库通道、注销只释放名字旧引用仍可用、析构在共享会话线程上、PB10 与 PB12.5 行为完全一致六条核心结论,双轨四绿 + 28/28 硬断言);2026-09-21 新增 Day42《PowerBuilder 控制结构全解:IF / CHOOSE CASE / FOR / DO LOOP 分支与循环的边界行为》,归入「PowerScript 语言基础」第 11 条(★and/or 不短路、裸 do...loop 不可编译、for 步长须字面量、choose case 区分大小写、正序删漏删五条核心结论,39 条硬断言全中);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 条。

共享共进共赢
Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
xiaosd

主题

0

回帖

1652

积分

金牌会员

积分
1652
贡献
在线时间
小时
2026-8-21 10:21:04 | 显示全部楼层
谢谢分享~
共享共进共赢
Sharing And Win-win Results
tomok

主题

0

回帖

1万

积分

论坛元老

积分
19808
贡献
在线时间
小时
2026-8-24 16:13:39 | 显示全部楼层
曾有个 PBAI 直接网页,查询PB咨询的,可没有了
共享共进共赢
Sharing And Win-win Results
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com

客服微信:18669893686
挂谷猜想 · 探索

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2026-10-14 07:32 , Processed in 0.030873 second(s), 10 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表