1

我遇到的问题是:我有一个 DataWindow,它在窗口打开时检查是否存在任何行,如果不存在,我手动插入一行。在某些时候,在我调用 DataWindow 上的更新之前,一行被插入到表中。当我调用更新时,一行已经存在并且我的更新无法保存,因为它使用的是插入而不是更新。有没有办法缓解这种情况?

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
4

4 回答 4

1

PowerBuilder 不会自动知道那里是否存在具有相同键的行。DataWindow 根据行状态生成 INSERT 或 UPDATE 语句(有关详细信息,请参阅帮助中的 GetItemStatus())。

目前还不清楚您的要求是什么。如果要插入新记录或覆盖现有记录,我建议从 DataWindow 进行存储过程更新,以确定是否需要 INSERT 或 UPDATE 并采取相应措施。如果您希望此客户端始终插入新记录,并适当调整主键值,以免覆盖或与现有数据冲突,我建议您查看您的 DBMS 是否支持您的键列的标识或序列值,然后查看 DataWindow 的更新属性对话框中的标识列功能。

祝你好运,

特里。

于 2012-04-05T16:31:11.000 回答
0

您需要先回答一个业务问题。你想丢失其他人的更新吗?

如果您正在获取 DW 消息:在检索和更新之间更改了行...这是一个有效的消息。如果您查看数据窗口,您会注意到默认情况下,更新使用的列都是可编辑的列。您可以将其更改为仅主键。这将使您的更新“工作”,但它也会覆盖其他人的更改。

听起来你的PK太笼统了。您可能想查看一种独特的、顺序驱动的方法。

杰森

于 2012-04-04T22:02:06.523 回答
0

不确定是否会使用“ row = dw_dates.InsertRow(1); ”,如果您想要一个虚拟行然后尝试使用 row = dw_dates.InsertRow(0); 这将在末尾插入行。此外,您可能希望使用 SetRow 或 ScrolltoRow 以使其成为当前行。

于 2012-04-11T06:29:02.987 回答
0

所以你说的是其他用户插入了该行。然后,您必须在调用 datawindow 上的 update() 之前再做一次检查。最好的解决方案是使用存储过程更新并检查行是否存在并决定是否执行 INSERT 或 UPDATE。但是话又说回来,如果您执行更新,您将覆盖其他人的数据。

于 2013-02-06T10:55:38.493 回答