Delphi - TClientDataSet: второй вызов applyupdates () не применяет обновления - PullRequest
0 голосов
/ 02 июля 2010

Опять у меня проблема с 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;

Код, само собой разумеется, я думаю.Когда я нажимаю кнопку 1, создается запись, и после вызова applyUpdates ее записывается в базу данных.Когда я нажимаю кнопку 2, я хочу внести изменения в эту запись и применить обновления к базе данных - и это не работает.Но когда я закомментирую applyUpdates в button1, applyUpdates в button2 работает правильно.

1 Ответ

1 голос
/ 06 июля 2010

Попробуйте изменить Provider.UpdateMode на upWhereKeyOnly и установить ключевое поле в Provider.OnUpdateData.

Я предполагаю, что вставка работает всегда, так как она выполняется как

 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>
...