-1

MySQL データベースで Delphi XE3 を使用しています。SQLconnection – SQLquery – DataSetProvider – ClientDataSet の配置があります。CDS への変更の ApplyUpdates を実行すると、変更はデータベースに正しく反映されますが、CDS を更新すると、「古い」値が置き換えられます。私が使用しているコードは次のとおりです。

 CDS.IndexFieldNames:='pop0';
 CDS.first;
 for W := 1 to 5 do begin  //   display the original data
  memo2.lines.add (IntToStr(CDS['pop0']));  CDS.Next;
 end;
 memo2.lines.add('');

  CDS.first;
  CDS.Edit;                   //    modify data
  CDS['pop0']:= 3004;
  CDS.Post;
  CDS.first;
 for W := 1 to 5 do begin   //   display the modified data
  memo2.lines.add (IntToStr(CDS['pop0']));  CDS.Next;
 end;
 memo2.lines.add('');

 CDS.ApplyUpdates(0) ;
 messagedlg('Check database',mtInformation,[mbOK],0);
 CDS.refresh;

 CDS.first;
 for W := 1 to 5 do begin   //   display the updated data
  memo2.lines.add (IntToStr(CDS['pop0']));  CDS.Next;
 end;

メモの出力は次のとおりです。

3
4
375
597
678

4
375
597
678
986

3
4
375
597
678

更新の代わりに CDS を閉じて開いてみましたが、同じ結果が得られました。なぜこれが起こっているのですか?

4

1 に答える 1

1

リフレッシュを呼びかけた理由を教えてください。通常、TClientDataSet (CDS) はそれを必要としません。

また、CDS を開いたときに SQLQuery が開いていましたか、それとも閉じていましたか? DatasetProvider (DSP) がそれを開いてすべての行を取得し、閉じて戻すように、それを閉じる必要があります。

DSP がデータセットが既に開いていることを検出した場合、レコードに沿って移動し、レコード パック ( Dataという名前) を作成して CDS に送信するだけです。データセットは閉じられずにそのまま残されます。

于 2013-08-17T22:46:14.677 に答える