2011-10-12 49 views
1

我正在使用Delphi 2010並使用dbexpress連接到MySQL數據庫。連接工作100%,我正在檢索我的數據。當我嘗試通過dbGrid更新數據時出現問題。我正在瀏覽表格中的所有條目,對它們執行檢查。當調用ApplyUpdates方法時,我得到「未找到記錄或被其他用戶更改」。Delphi 2010通過ClientDataSet失敗的MySQL更新

將DataSetProvider上的updateMode更改爲upWhereKeyOnly,我現在處於接收「無法找到記錄,未指定密鑰」的情況。我已經嘗試加入

BasysClientDataSet.FieldByName('idPolicy').ProviderFlags := [pfInUpdate, pfInWhere, pfInKey]; 

這樣的代碼,但我得到相同的錯誤。我曾嘗試加入ProviderFlags到的SQLQuery但我沒有得到這樣的領域「idPolicy」

+0

包含dbExpress的源代碼,因此您可以調試到創建實際SQL UPDATE語句及其WHERE子句的位置。它幫助我在dbExpress應用程序中找到類似問題的原因。 – mjn

+0

Hey Mjn,感謝您的回覆,我很確定我知道爲什麼會這樣做,當將數據從MySQL傳輸到Delphi並返回時,會出現某些DateTimeStamps和浮點值的沮喪,我已經閱讀了所有內容通過互聯網瞭解它。那就是我正在尋找將UpdateMode更改爲upWhereKeyOnly並指定它應該用於更新的主鍵列的原因。我採取了它在數據庫上執行的查詢,並刪除導致問題的列並在數據庫上手動運行它,並且它可以正常工作。 – LouwEtienne

+0

好吧,所以主要問題(不使用解決方法)是如何將updatemode設置爲upWhereKeyOnly而不會導致「無法找到記錄,無指定密鑰」錯誤消息?也許如果這更清楚,誰知道它會回答。但另一方面,由於併發用戶可以相互覆蓋其他更改,因此在多用戶環境中只有上下關鍵是危險的。 – mjn

回答

0

嘗試DataSetProvider的組件的ResolveToDataSet屬性設置爲

+0

我已將該屬性更改爲true,並且在嘗試對ClientDataSet應用更新時仍然收到相同的錯誤,還有什麼我需要執行的操作來強制更新使用特定列作爲更新的密鑰? – LouwEtienne

+0

對不起,我不知道。 –

1

嘗試爲所有主鍵列設置提供者標誌pfInKey,就像您所做的一樣,但不是在客戶端數據集中,而是在源數據集中。即使我不明白當db express忽略這些設置時客戶端數據集中的字段是什麼,這用於幫助我?我會說它的一個錯誤。

0

嘗試創建此過程並將其用於供應商BeforeUpdateRecord事件中。

procedure SetOriginFlags(Source, Dest: TCustomClientDataSet); 
var 
    i: Integer; 
begin 
    for i := 0 to Source.FieldCount - 1 do 
    begin 
    if Dest.FindField(Source.Fields[i].FieldName) <> nil then 
    begin 
     Dest.FindField(Source.Fields[i].FieldName).ProviderFlags := 
     Source.Fields[i].ProviderFlags; 
     if Dest.FindField(Source.Fields[i].FieldName).ProviderFlags <> [pfHidden] then 
     Dest.FindField(Source.Fields[i].FieldName).Origin := 
      Source.Fields[i].FieldName; 
    end; 
    end; 
end; 
+0

你可以請你格式化你的代碼 –