【问题标题】:How can I refresh a TClientDataSet without applying pending updates?如何在不应用挂起更新的情况下刷新 TClientDataSet?
【发布时间】:2012-11-12 18:08:03
【问题描述】:

这是我想要完成的:

  1. 通过 TSQLDataset 的 CommandText 从数据库中检索 1 条记录:SELECT * FROM myTable WHERE ID = 1
  2. 使用 TClientDataset 修改记录。 (1 个待更新)
  3. 检索下一条记录。 SELECT * FROM myTable WHERE ID = 2
  4. 修改记录。 (现在有 2 个待更新)
  5. 最后,通过 ApplyUpdates 函数将 2 个挂起的更新发送回数据库。

当我执行第 3 步时,我得到“必须在刷新数据之前应用更新”。

如何在不应用挂起更新的情况下刷新 TClientDataSet?

【问题讨论】:

  • TClientDataSet 旨在保存许多记录。您使用它一次提取和修改一条记录的方式似乎效率低下。将用户需要修改的两个(全部)记录都拉出来,让用户修改这些记录,然后使用ApplyUpdates all-at-once 将更新应用到数据库不是更好吗?
  • @James,如果有一个潜在的数百万基本表/记录集,将所有这些数据带到客户端来修改几条记录似乎效率低得多。
  • @jachguate - 我同意。然而,最有效的方法似乎是在提取更多数据之前应用更新。但是 OP 并没有解释太多关于该表或延迟(批量)更新为何如此重要的原因。如果需要延迟更新,那么您的回答似乎是最好的解决方案。
  • @JamesL.,对不起,我应该说明我一次拉一张唱片的原因。该数据库包含 50 万条记录,提取所有这些记录需要大量时间和网络资源。顺便说一句,我没有使用任何数据库网格,只是 TDBEdits 来修改每条记录。

标签: database delphi dbexpress tclientdataset


【解决方案1】:

您可以调用AppendData 方法手动将数据包附加到您的DataSet。

在提供程序与 ClientDataSet 位于同一应用程序中的应用程序中,您可以编写如下代码:

begin
  ConfigureProviderToGetRecordWithID(1);
  //make the ClientDataSet fetch this single record and not hit the EOF.
  ClientDataSet1.PacketRecords := 1; 
  ClientDataSet1.Open;
  ClientDataSet1.Edit;
  ModifyFirstRecord;
  ClientDataSet1.Post;
  ConfigureProviderToGetRecordWithID(2);
  ClientDataSet1.AppendData(DataSetProvider1.Data, False); 
  //now you have two records in your DataSet without losing the delta.
end; 

这是一种伪代码,但显示了您可以使用的一般技术。

【讨论】:

  • 感谢您的回答。我会试试这个,让大家知道它是否有效:)
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多