2

我有一个带有查询、数据集、可编辑 dbgrid 和 updatesql 组件的表单。当我需要保存在 dbgrid 中所做的更改时,我调用此过程:

procedure TEditCardDetailForm.SaveChanges;
begin
  Database1.StartTransaction;
  try
    Query2.ApplyUpdates;
    Database1.Commit;
  except
    Database1.Rollback;
    raise;
  end;
  Query2.CommitUpdates;
end;

但是,当我按 Enter 键或在编辑 dbgrid 中的单元格后转到另一行时,我希望将更改自动应用于数据库——就像我使用 TTable 组件时所做的那样。有没有办法做到这一点?

4

2 回答 2

2

如果我理解正确(如果不是,请纠正我)你有一个 CachedUpdates 设置为 true 的 TQuery,但希望它表现得好像它不会使用缓存但立即更新。如果是这种情况,您设置 TQuery 的方式与您想要的行为相矛盾。缓存的更新将在客户端“保留”,直到您决定使用 ApplyUpdates 手动将它们发布到数据库。

如果您可以将 CachedUpdates 设置为 false,则只需执行以下操作:

  1. 通过其 UpdateObject 属性将 TUpdateSQL 链接到 TQuery。
  2. 编写插入、更新和删除语句并将它们分配给 TUpdateSQL 的 InsertSQL、ModifySQL 和 DeleteSQL 属性。

我猜你已经完成了这两件事,所以将 CachedUpdates 设置为 false 就可以了。

您可以在此处找到有关 Delphi 5 缓存更新的更多信息。

高温高压

于 2012-10-03T19:17:58.233 回答
1

这里有两种情况需要处理:

  1. 更改网格行时保存更改
  2. 更改网格列时保存更改

第一个很容易通过在底层数据集(,a ?)的情况下调用您的SaveChanges过程来实现。AfterPostquery2TClientDataSet

对于第二个,您只需query2.Post在列更改后调用。这可以OnDataChangedatasource. 确保在调用之前检查是否处于Field <> nil插入编辑模式datasetpost

于 2012-10-04T07:56:16.143 回答