Delphi - TClientDataSet:对applyupdates()的第二次调用不应用更新

时间:2010-07-02 10:51:37

标签: delphi tclientdataset

我再次遇到TClientDataSet问题。 我想这很简单,但我现在已经挣扎了一段时间。

以下是一些显示我想要做的代码:

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;

我认为代码是自我解释的。 当我按下button1时,会创建一条记录,并在调用applyUpdates后将其写入数据库。 当我按下button2时,我想对此记录进行更改并将更新应用于数据库 - 这不起作用。 但是当我在button1中注释掉applyUpdates时,button2中的applyUpdates正常工作。

1 个答案:

答案 0 :(得分: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>