ADO,Adonis,更新标准

时间:2009-01-21 10:33:06

标签: delphi ado

在表单上,​​我有一个Quantum Grid和一些支持db的editcomponents。在网格中追加新记录时,在网格和单独的editcompennts中键入一些editvalues,我收到一个错误:

  

EOleException:无法找到行进行更新。自上次阅读以来,某些值可能已经变为

经过一些谷歌搜索后,我认为将“更新标准”属性从adCriteriaAllCols更改为adCriteriaKey可能是正确的解决方案。但是,如何以及何时在Adonis查询中执行此操作?

6 个答案:

答案 0 :(得分:1)

如果您的数据集包含自动增量字段或一个或多个字段具有默认值,那么这可能是问题所在。调用Post字段后,在数据库中更改其值,但数据集可能无法检测到

答案 1 :(得分:0)

虽然我不使用Adonis,但我相信它有可能使用相同的机制TClientDataset(CDS)用来识别组成主键的字段:属性 TField.ProviderFlags

我相信它可能是一个开始寻找的好地方。

答案 2 :(得分:0)

实际上,ADO提供dynamic property来控制基于查询的更新(QBU)行为 大多数代码都包含在ADOInt.pas中,相应的事件是OnAfterOpen用于记录集属性(任何TADODataSet),OnCreate用于连接属性(TADOConnection)。 我想“更新标准”在这种情况下不是解决方案,因为它处理WHERE子句以指定用于更新的字段。 您可以按如下方式更改“更新重新同步”:

//After open a TCustomADODataSet
  TCustomADODataSet(DataSet).Properties['Update Resync'].Value :=
    adResyncAutoIncrement + adResyncUpdates + adResyncInserts;

答案 3 :(得分:0)

如果您的查询中有联接表:

TADOQuery无法在sql数据库中编辑和发布数据。

你可以创建其他TADOQuery并通过主键选择而不需要任何连接表,然后编辑然后在sql数据库中发布数据。

答案 4 :(得分:0)

我遇到了类似的问题 - 更新所有值相同的行会导致您获得错误。我添加了标志" Option = 2"到我的ado连接结束,这解决了这个问题。

答案 5 :(得分:0)

这是旧的。但我的情况可能发生在其他人身上。所以我发布了这个答案。

这个错误也发生在我身上。 我正在使用Access数据库并在表单上使用一些TADOTable。 关系是master-detail,我将所有表与IDE Designer连接在一起。 我的表是tbl_Floor,tbl_FloorParts,tbl_Seat,其中tbl_Floor是tbl_FloorParts的主人,而tbl_FloorParts是tbl_Seat的主人。 所以为了解决这个错误,我做了这个伎俩。

procedure Tfrm_Main.UpdateTblFloor(...);
var
  FID:Integer;
  q:TADOQuery
begin
  FID:=tbl_Floor.FieldByName('FID').AsInteger;
  tbl_Floor.Close;
  q:=TADOQuery.Create(nil);
  try
    q.Connection:=tbl_Floor.Connection;
    q.SQL.Add('Update [Floor]');
    q.SQL.Add(...);//Set Fields that needed to be updated
    q.SQL.Add('where [FID]='+IntToStr(FID));
    q.ExecSQL;  
  finally
    q.free;
  end;
  tbl_Floor.Open;
  tbl_Floor.Locate('FID',FId,[loPartialKey]);
end;

我为tbl_Floor添加了这些事件,tbl_FloorParts

procedure Tfrm_Main.tbl_FloorAfterOpen(DataSet: TDataSet);
begin
  tbl_FloorParts.Open;
end;

procedure Tfrm_Main.tbl_FloorBeforeClose(DataSet: TDataSet);
begin
  tbl_FloorParts.Close;
end;

procedure Tfrm_Main.tbl_FloorPartsAfterOpen(DataSet: TDataSet);
begin
  tbl_Seat.Open;
end;

procedure Tfrm_Main.tbl_FloorPartsBeforeClose(DataSet: TDataSet);
begin
  tbl_Seat.Close;
end;