PowerBuilder报错:检索与更新间行数据变更问题求助
问题分析与解决方法
错误原因
你用的是Table1 Left Join Table2关联方式,检索结果里会包含Table1有数据但Table2无对应匹配的行,这些行的Table2主键列(Col1/Col2/Col3)都是NULL。当你修改这类行的Table2列值时,数据窗口按照Use Delete Then Insert的更新策略,会先执行DELETE FROM Table2 Where Col1 IS NULL And Col2 IS NULL And Col3 IS Null;——但数据库里根本不存在主键全为NULL的Table2行,所以这条Delete语句没有影响任何行。PowerBuilder会把这种“预期删除1行但实际0行”的情况判定为「行在检索后被修改」,从而抛出更新错误。
解决步骤
1. 调整更新策略(最直接方案)
把数据窗口的Key Modification从Use Delete Then Insert改成Use Update:
- 对于原本就有Table2数据的行(主键非空),数据窗口会直接生成Update语句修改现有行;
- 对于原本没有Table2数据的行(主键从NULL变为有值),数据窗口会自动生成Insert语句插入新行,无需先执行Delete。
2. 保留Delete Then Insert的适配方案
如果必须使用Use Delete Then Insert,需要提前区分行的类型:
- 遍历数据窗口的所有行,判断Table2的主键列是否原本为NULL(即检索时就没有对应Table2行);
- 对这类行,调用
dw_1.SetItemStatus(row, 0, NewModified!),把行状态从Modified!改为NewModified!,这样数据窗口会直接执行Insert,跳过Delete步骤。
3. 检查主键列配置
确认Table2的主键列在数据窗口中被正确标记为Unique Key Columns,确保数据窗口能准确识别哪些行是Table2已存在的记录,哪些是新增的。
4. 手动拆分更新逻辑(备选)
如果上述方法都不适用,可以手动拆分更新流程:
- 先筛选出Table2主键从NULL变为非空的行,单独执行Insert操作;
- 再处理Table2主键原本非空且被修改的行,执行Delete+Insert或Update操作;
- 最后调用
dw_1.Update()时,确保只处理对应状态的行。
内容的提问来源于stack exchange,提问作者Gokul Kannan
相关产品推荐
相关产品推荐

