2010-07-02 75 views
0

再次我有一個TClientDataSet的問題。 我想這是一件非常簡單的事情,但我現在爲此奮鬥了一段時間。德爾福 - TClientDataSet:第二次調用applyupdates()不適用更新

下面是一些代碼顯示的內容是我想做的事:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ClientDataSet1.Insert; 
    ClientDataSet1.FieldByName('anruf_von').AsDateTime := time; 
    ClientDataSet1.Post; 
    ClientDataSet1.ApplyUpdates(0); // without this applyUpdates in button2 works. 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    ClientDataSet1.edit; 
    ClientDataSet1.FieldByName('anruf_bis').AsDateTime := time; 
    ClientDataSet1.Post; 
    showmessage(intToStr(ClientDataSet1.ChangeCount)); // returns 1 
    if ClientDataSet1.ChangeCount > 0 then 
    ClientDataSet1.applyUpdates(0); 
end; 

的代碼是自我解釋我的想法。 當我按下按鈕1時,會創建一條記錄,並在調用applyUpdates之後將其寫入數據庫。 當我按下按鈕2時,我想對此記錄進行更改並將更新應用到數據庫 - 這不起作用。 但是,當我註釋掉button1中的applyUpdates時,button2中的applyUpdates正常工作。

+0

不起作用?你是什​​麼意思? – 2010-07-02 11:01:37

+0

我的意思是更新沒有寫入數據庫表。 – doubleu 2010-07-02 11:12:24

+0

在這種情況下,我會檢查服務器端以查看提供程序使用的SQL。或者,也許第一個調用(Insert)不會返回主鍵字段的值(例如,如果它是由服務器自動生成的),那就是更新失敗的原因? – 2010-07-02 11:18:14

回答

1

嘗試將Provider.UpdateMode更改爲upWhereKeyOnly,並在Provider.OnUpdateData中設置關鍵字段。

我客串是因爲它是作爲

INSERT INTO ATABLE (anruf_von, anruf_bis) VALUES (...) 

執行,但更新失敗,因爲WHERE部分將DB存儲的時間與ClientDataSet的時間相匹配的插入工作始終。 事實上,你可能會嘗試匹配兩個雙打,這是一個禁忌。

UPDATE ATABLE SET anruf_bis=<Time> 
WHERE anruf_von=<WRONG Time, with more precision than stored in db> 

當您設置的UpdateMode到upWhereKeyOnly,生成的SQL sholud這個樣子

UPDATE ATABLE SET anruf_bis=<Time> 
WHERE ID=<ID Value>