我再次遇到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正常工作。
答案 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>