【问题标题】:Dbgrid - automatic post to databaseDbgrid - 自动发布到数据库
【发布时间】:2012-10-03 14:45:37
【问题描述】:

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

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

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

【问题讨论】:

  • 您能指定您使用的是哪个 Delphi 版本吗?另外,我建议尽可能避免使用 BDE 组件,因为它们早已被弃用。
  • 那又怎样? D5 或多或少能够使 EXE 与最近的 Windows 兼容。甚至 XP 主题也可从 SoftGems 获得。但是 BDE 与较新的 Windows 的兼容性报告相当差,并且没有更多的开发或支持。在我最后的 D5 天里,我使用 Firebird 数据库后端和 UIB 组件集

标签: delphi delphi-5


【解决方案1】:

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

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

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

我猜你已经做了这两件事,所以把 CachedUpdates 设置为 false 应该可以做到。

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

HTH

【讨论】:

  • 我将 CachedUpdates 从 True 更改为 False,正如你告诉我的那样。然后我运行该项目并在打开表单时收到消息:“... EDBEngineError with message 'Invalid use of keyword. Token: Date, LineNumber: 4'” 当 CachedUpdates 设置为 True 时,查询工作正常。跨度>
  • 该错误通常出现是因为您的数据库引擎(或 BDE?)不喜欢 SQL 中的某些内容。你能告诉我们你的SQL吗?另外,您是否将 LiveRequest 设置为 true(不应该,只是询问是否)?
  • 这里是查询:SELECT cd.N, cd.hourstart, cd.hourfinish, o.objname, cd."work", cd.worktime FROM Card c JOIN CardDetail cd ON c.N=cd。卡 JOIN 对象 o ON cd.project=o.N WHERE c.worker=:worker AND c.data=CONVERT(DATE, GETDATE()) ORDER BY cd.hourstart;我已经设置了worker参数。
  • 不太确定,因为我不知道您使用的是哪个数据库,但是 cd."work" 中的 " 会使其在 Oracle 上失败(刚刚测试过)。可以你尝试删除它?
  • 我不知道那个数据库引擎,但似乎问题在于 convert(date(getdate()) 部分。我建议尝试更改它跨度>
【解决方案2】:

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

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

第一个很容易实现,方法是在基础数据集的AfterPost 事件中调用SaveChanges 过程(query2TClientDataSet?)。

对于第二个,您只需在列更改后调用query2.Post。这可以在datasourceOnDataChange 事件中完成。在调用 post 之前,请务必检查 Field <> nildataset 是否处于 insertedit 模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多