【问题标题】:Define custom POST method for MyDAC为 MyDAC 定义自定义 POST 方法
【发布时间】:2011-12-10 10:33:44
【问题描述】:

我有三个表objects、(主键object_IDflags(主键flag_ID)和object_flagsobjectsflags 之间的交叉表以及一些额外信息)。

我有一个查询返回所有标志,如果给定对象具有某个标志,则返回一或零:

SELECT
  f.*,
  of.*,
  of.objectID IS NOT NULL AS object_has_flag,
FROM
  flags f
  LEFT JOIN object_flags of
    ON (f.flag_ID = of.flag_ID) AND (of.object_ID = :objectID);

在应用程序(用 Delphi 编写)中,所有行都加载到一个组件中。用户可以通过单击表格中的复选框来分配标志,修改数据。

假设编辑了一行。根据 object_has_flag 的值,需要做以下事情:

  • 如果 object_has_flag 为真且仍然为真,则应在 objects_flags 中的相关行上进行更新。
  • 如果 object_has_flag 为 false 但现在为 true,则应执行 INSERT
  • 如果 object_has_flag 为真,但现在为假,则应删除该行

这似乎不能在一个查询https://stackoverflow.com/questions/7927114/conditional-replace-or-delete-in-one-query 中完成。

我使用 MyDAC 的 TMyQuery 作为数据集。我已经编写了单独的代码来执行必要的查询以保存对行的更改,但是如何将其耦合到数据集?我应该使用什么事件处理程序,以及如何告诉 TMyQuery 它应该刷新而不是发布?

编辑:显然,问题所在并不完全清楚。不能使用标准的 UpdateSQL、DeleteSQL 和 InsertSQL,因为有时在编辑一行(不删除或插入一行)之后,必须执行 INSERTDELETE

【问题讨论】:

  • 在您之前的问题中,您没有提到您使用的现成组件是否是 MyDAC。是这样吗?
  • @menjaraz(抱歉耽搁了):是

标签: mysql delphi mydac


【解决方案1】:

简短的回答是,套用你的答案here

  • 查找“使用 MyDAC 数据集组件更新数据”的文档(自 MyDAC 5.80 起)。

每个 TCustomDADataSet(例如 TMyQuery)后代都可以使用 SQLInsertSQLUpdateSQLDelete 属性。

TMyUpdateSQL 也是一个很有前途的自定义更新操作组件。

【讨论】:

  • 是的。但是,一些内置的健全性检查会引起麻烦。例如,在记录已存在的情况下使用 REPLACE 时,服务器将返回受影响的 2 行。内置的完整性检查会引发异常,因为只编辑了一行。
【解决方案2】:

似乎最简单的方法是使用BeforePost 事件,并使用几个字段的OldValueNewValue 属性确定必须执行的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 2021-03-25
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2016-02-06
    • 2014-10-23
    • 2019-11-18
    相关资源
    最近更新 更多