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を呼び出した後、データベースに書き込まれます。button2を押すと、このレコードに変更を加えてデータベースに更新を適用したいのですが、それは機能しません。しかし、button1のapplyUpdatesをコメントアウトすると、button2のapplyUpdatesは正しく機能します。

4

1 に答える 1

1

Provider.UpdateMode を upWhereKeyOnly に変更し、Provider.OnUpdateData にキー フィールドを設定してみてください。

私の推測では、挿入は次のように実行されるため、常に機能します。

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

しかし、更新は失敗します。なぜなら、WHERE 部分は DB に保存された時刻と clientdataset からの時刻を一致させるからです。実際、おそらく 2 つの double を一致させようとするでしょうが、これは不可能です。

 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 に答える