0

我再次遇到了 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 后将其写入数据库。当我按下按钮 2 时,我想更改此记录并将更新应用到数据库 - 这不起作用。但是当我注释掉button1中的applyUpdates时,button2中的applyUpdates可以正常工作。

4

1 回答 1

1

尝试将 Provider.UpdateMode 更改为 upWhereKeyOnly,并在 Provider.OnUpdateData 中设置 key 字段。

我的猜测是插入总是有效,因为它被执行为

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

但更新失败,因为 WHERE 部分会将数据库存储的时间与来自客户端数据集的时间相匹配。事实上,你可能会尝试匹配两个双打,这是一个禁忌。

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

当您将 UpdateMode 设置为 upWhereKeyOnly 时,生成的 SQL 应该如下所示

 UPDATE ATABLE SET anruf_bis=<Time> 
 WHERE ID=<ID Value>
于 2010-07-06T08:51:23.543 回答