DataWindow错误:在检索和更新之间更改了行

时间:2010-07-07 07:36:09

标签: powerbuilder datawindow

我在更新DataWindow时收到错误,其中显示“检索和更新之间的行已更改”。解决方案是什么?

7 个答案:

答案 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列定义与数据库列定义不匹配。

示例:

  1. columnA在数据库中定义为char(10)

  2. datawindow使用columnA构建为char(10)

  3. columnA在数据库

  4. 中更改为char(20)
  5. 数据在columnA外部添加,超过10个字符。

  6. datawindow检索截断为10个字符(根据应用程序设置有或没有错误。)

  7. 删除/更新行可能会产生“检索和更新之间的行更改”

答案 6 :(得分:0)

此行为由“更新”属性'监控。您的数据窗口,更具体地说,是更新/删除的部分' Where子句'这可以控制'哪里有'在更新时,Powerbuilder将使用该子句,因为您可以使用Datawindow的SQLPreview事件进行检查:

  1. 键列:仅在where子句中使用键列。如果您使用此选项,则存在在检索和更新之间某些列已在其他位置(不一定是PowerBuilder)进行修改的风险。只有最新的更新才会保留在数据库中。当然,如果修改了自己的关键列,您将收到消息' Row已更改'。
  2. 位于键列顶部的
  3. 键和可更新列,您可以在“可更新列”框中添加所有可更新列(如下所示)。每当修改一列(同样不一定使用Powerbuilder)时,将不会检索该行,并且您将收到消息' Row已更改'。在许多情况下,这是过度的。
  4. 键和修改列:只有为特定行修改的列才会添加到键中 现在,您可以根据应用程序的具体情况选择其中一种。