2009-01-21 41 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;