我遇到的问题是:我有一个DataWindow,在窗口打开检查是否存在任何行,如果没有,我手动插入一行。在某些时候,在我在DataWindow上调用update之前,正在向表中插入一行。当我调用update时,一行已经存在并且我的更新无法保存,因为它使用的是insert而不是update。有没有办法减轻这种情况?
dw_dates.SetTransObject(SQLCA);
dw_dates.Retrieve(gs_facility_pfi, is_pcn);
if(dw_dates.rowcount() = 0) then
int row;
row = dw_dates.InsertRow(1);
dw_dates.setitem(row, 'patient_ctrl_num', is_pcn);
dw_dates.setitem(row, 'pfi_num', gs_facility_pfi);
end if
答案 0 :(得分:1)
PowerBuilder不会自动知道是否存在具有相同密钥的行。 DataWindow根据行状态生成INSERT或UPDATE语句(有关详细信息,请参阅帮助中的GetItemStatus())。
你的要求是什么并不是很清楚。如果要插入新记录或覆盖现有记录,我建议从DataWindow更新存储过程,以确定是否需要INSERT或UPDATE并相应地执行操作。如果您希望此客户端始终插入新记录,并适当调整主键值以便您不会覆盖现有数据或与现有数据冲突,我建议您查看您的DBMS是否支持您的键列的标识值或序列值,并查看DataWindow的“更新属性”对话框中的“标识列”功能。
祝你好运,特里。
答案 1 :(得分:0)
您需要先回答业务问题。你想失去对方的更新吗?
如果您正在获取DW msg:检索和更新之间的行更改...这是一个有效的消息。如果您查看数据窗口,默认情况下您会注意到更新使用的列是所有可编辑列。您可以将其更改为主键。这将允许您的更新“工作”,但它也会覆盖其他人的更改。
听起来你的PK太通用了。您可能希望查看一种独特的序列驱动方法。
杰森
答案 2 :(得分:0)
不确定是否会使用“row = dw_dates.InsertRow(1);
”,如果你想要一个虚拟行,那么尝试使用row = dw_dates.InsertRow(0);
这会在末尾插入行。您也可以按顺序使用SetRow或ScrolltoRow使其成为当前行。
答案 3 :(得分:0)
所以你说的是其他一些用户插入了这行。 然后,您必须在数据窗口上调用update()之前再进行一次检查。 最好的解决方案是使用存储过程更新并检查行是否存在并确定是否要执行INSERT或UPDATE。但话又说回来,如果你做了更新,你将覆盖其他人的数据。