-1

我将 Delphi XE3 与 MySQL 数据库一起使用。我有一个 SQLconnection - SQLquery - DataSetProvider - ClientDataSet 的排列方式。当我对 CDS 的修改应用更新时,数据库中的更改会正确受到影响,但是当我刷新 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

您能告诉我们为什么要调用 Refresh 吗?TClientDataSet (CDS) 通常不需要这样。

此外,打开 CDS 时,SQLQuery 是打开还是关闭?它必须关闭,这样 DatasetProvider (DSP) 才能打开它,检索所有行并将其关闭。

如果 DSP 发现数据集已经打开,它只会沿着记录导航,构建记录包(命名为Data)并将其发送到 CDS。数据集将被单独留下,不会被关闭。

于 2013-08-17T22:46:14.677 回答