【问题标题】:clientdataset.refresh retrieves old dataclientdataset.refresh 检索旧数据
【发布时间】:2013-08-16 15:11:34
【问题描述】:

我将 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 作为刷新的替代方法,但得到了相同的结果。任何想法为什么会发生这种情况?

【问题讨论】:

  • 我希望第一行成为修改后的数据的“3004”。你的输出真的反映了你的测试用例吗?
  • 您应该检查 ApplyUpdates 的结果,以确保您的更改实际上已写入数据库。
  • 其实变化在 cds.Post 之后立即在本地可见。 ApplyUpdates 似乎没有成功。这就是为什么你应该检查结果。
  • @Sertac,输出反映了测试用例,因为数据是由 pop0 字段索引的。 @Uwe,ApplyUpdates 返回 0。我知道 ApplyUpdates 成功,因为我从外部检查了数据库。 @Marcus,查询是select * from output
  • 如果您尝试更新不在索引中的字段会怎样?

标签: mysql delphi delphi-xe3 dbexpress


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2020-11-26
    • 2019-08-29
    相关资源
    最近更新 更多