我在更新DataWindow时收到错误,其中显示“检索和更新之间的行已更改”。解决方案是什么?
答案 0 :(得分:5)
如果您在多个(非共享)DataWindow中显示相同的行,然后尝试更新它们,则会发生这种情况。其他原因是不正确使用SetItemStatus();在update()语句中错误地使用状态标志;最后,这是打算检测的原因,另一个用户在你之前更新了这行。
答案 1 :(得分:2)
这已经解决了吗?这可能发生的原因有几个,一个是该行已被另一个用户更新。在数据对象的更新属性中,您可以选择更新方法,使用键值,键值和修改值,键和所有可更新列。
如果您确定没有并发问题,那么您可以将此设置更改为“仅使用键值”。它将使更新的where子句仅包含键值,而不会评估其他列的更改。
如果发生验证错误,您可能需要记住将项目状态设置为未修改。要将所有行设置为未修改,您可以执行dw_1.setitemstatus(1,0,Primary!,NotModified!),如果我的内存正确,则会将第一行的所有列设置为NotMofidied!。您也可以执行ResetUpdate()或重新检索数据。
希望这会有所帮助。 富答案 2 :(得分:2)
这通常意味着你在update where子句中包含的某些列被bing更新到其他地方,例如通过触发器。另一个原因包括在与oracle交谈时没有空字符串为字符串列设置为null。 oracle将发送给它的任何空字符串转换为空值,因此后续更新将找不到相同的行,除非您告诉pb将其视为null。查看你告诉pb要包含在where子句中的列(在更新规范中),并确保它们确实是你需要的列。
答案 3 :(得分:1)
当您有两个更新相同数据库行的数据窗口行时,也会发生这种情况。
(不太好)示例:
该表没有主键,但数据窗口使用DateOfBirth。
Name: Dennis Miller DateOfBirth: 19531103 Vocation: comedian
Name: Kate Capshaw DateOfBirth: 19531103 Vocation: actress
请注意,Dennis和Kate具有相同的DateOfBirth。
让我们假设做出了这些改变
Name: Mr. Dennis Miller
Name: Ms. Kate Capshaw
当调用dw_1.update()时,会显示以下消息:
"Row changed between retrieve and update"
因为每行都更新了两次,首先是' Mr。丹尼斯米勒'然后跟' Ms。 Kate Capshaw'
答案 4 :(得分:1)
我意识到这是一个老问题,但我认为我会添加我的解决方案以防万一。在我的例子中,数据窗口发出UPDATE
语句,当该语句在SQL管理工作室中运行时,返回的列与预期的列匹配。但是,查询显示两次(1行(s)受影响)。触发器正在更新与正在更新的表无关的行。将SET NOCOUNT ON
添加到该触发器会导致1个实例(其中1个行受影响)并且检索和更新之间的行已更改。
答案 5 :(得分:0)
另一种可能性是datawindow列定义与数据库列定义不匹配。
示例:
columnA在数据库中定义为char(10)
datawindow使用columnA构建为char(10)
columnA在数据库
数据在columnA外部添加,超过10个字符。
datawindow检索截断为10个字符(根据应用程序设置有或没有错误。)
删除/更新行可能会产生“检索和更新之间的行更改”
答案 6 :(得分:0)
此行为由“更新”属性'监控。您的数据窗口,更具体地说,是更新/删除的部分' Where子句'这可以控制'哪里有'在更新时,Powerbuilder将使用该子句,因为您可以使用Datawindow的SQLPreview事件进行检查: