2009-01-21 69 views
1

在表单上,​​我有一个Quantum Grid和一些支持db的editcomponents。当附加在电网的新纪录,无论是在电网和独立editcompoennts输入一些editvalues,我得到一个错误:ADO,Adonis,更新标准

EOleException: Row cannot be located for updating. Some values may have been chenged since it was last read

一些google搜索后,我觉得从adCriteriaAllCols改变“更新Criteria'属性来adCriteriaKey可能是正确的解决方案。但是如何以及何时在Adonis查询上做到这一点?

回答

0

虽然我不使用阿多尼斯,我相信这是它使用相同的机制的TClientdataSet(CDS)可能用来识别构成主键字段:物业TField.ProviderFlags

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

+0

其实,所有的dbcomponents现在扔掉。使用常规组件重新创建gui,使用对象创建中间件,并将对象转换为数据库转换 - 它肯定比用adonis搞乱更快...... – Vegar 2009-01-29 19:58:08

+0

它真的很神秘吗?哇... – 2009-01-29 20:20:55

+0

其实,我使用clientdatasets的一切...而且由于安德烈亚斯(安德烈亚斯豪斯拉登)为他们加快了速度,情况甚至更好。 – 2009-02-02 17:56:22

1

如果您的数据集包含自动增量字段或者一个或多个字段具有默认值,那么这可能是问题。调用后场改变它们的价值在分贝,但可能无法通过数据集中

0

其实ADO提供dynamic property控制基于查询的更新(合格交易单位)行为 大部分代码是覆盖在ADOInt.pas,相应的事件被检测之后是OnAfterOpen记录集属性(任何TADODataSet)和OnCreate连接属性(TADOConnection)。 我猜'更新标准'不是这种情况下的解决方案,因为它处理WHERE子句来指定要用于更新的字段。 如下您可以更改“更新重新同步”:

//After open a TCustomADODataSet 
    TCustomADODataSet(DataSet).Properties['Update Resync'].Value := 
    adResyncAutoIncrement + adResyncUpdates + adResyncInserts; 
0
,如果你有连接表中查询

TADOQuery不能在SQL数据库编辑和发布数据。

您可以创建其他TADOQuery,并按主键进行选择,无需任何连接表并编辑,然后在sql数据库中发布数据。

0

我有一个类似的问题 - 更新所有值相同的行将导致您遇到的错误。我在我的ado连接的结尾添加了“Option = 2”标志,并解决了这个问题。

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;