【问题标题】:Can Firedac handle conditional SQL statementsFiredac 可以处理条件 SQL 语句吗
【发布时间】:2021-11-15 23:05:15
【问题描述】:

有没有办法使用Firedac 来处理条件场景。

主表有一个名为 INVOICESCOUNT 的列。

成功删除发票后,INVOICESCOUNT 会减少。

例如,这样的 SQL 伪代码语句:

Delete From Invoices where INVOICE=500;
Update Customers SET INVOICECOUNT=INVOICECOUNT-1 WHERE Customer=1  (if prior statement returns 1 affected row);

在第一个 FDQuery 返回成功执行后,我需要将它嵌入到同一个 SQL 语句中,而不是让 Delphi 源代码处理分别执行 2 个语句。

感谢您的建议。

【问题讨论】:

  • 单独执行语句有什么问题?如果您想避免使它们保持同步的问题,请将语句放在事务中,甚至是存储过程中。
  • 代码将在服务器上......所以它会是随时进入的一大块事务。最终将在 AWS 或 Azure 托管的 mysql 服务上托管它,所以我认为发送 10 个 SQL 语句(5 组 2 个 sql 行)会更有效,而不是执行 10 个 SQL 查询来更新 5 个发票删除(从 5 个不同的客户)。
  • Customer 字段是否存在于Invoices 表中?如果是这样,那么您是否考虑过在Invoices 表上使用DELETE TRIGGER?每当从Invoices 中删除记录时,触发器可以提取Old 记录的Customer,然后相应地提取UPDATE Customers 表。这样一来,您的代码就不必手动 UPDATE Customers 表,只需 DELETE Invoices 记录,UPDATE 将自动完成。
  • @RemyLebeau 感谢您的建议。唯一的客户字段是 Invoices 表中的 CustomerID。哦,注意了,我可以使用TRIGGER 进行删除,但我也有一些情况,即对发票字段的某些字段进行编辑,也需要更新客户表。
  • 触发器也适用于插入和更新。您可以访问旧记录和新记录,因此您可以根据需要检查特定字段的更改并采取相应措施

标签: delphi firedac


【解决方案1】:

这样好吗?

我理解,我的注意力不足,在这种情况下,我可以使用来自 DBMS 本身的信息,例如,如果 DBMS 是 SQL 服务器。

Delete From Invoices where INVOICE=500    
IF @@ROWCOUNT=1
begin
  Update Customers SET INVOICECOUNT=INVOICECOUNT-1
  WHERE Customer=1
end.

如果您的 DBMS 不允许,我建议您使用存储过程。

【讨论】:

  • OP 在他们的问题中明确表示,他们不想像这样分别执行多个 SQL 语句。
  • 好的,已经调整好了。
  • 在 SQL SERVER 中它也是一个语句,它是查询的一部分。
  • @JoaoBoscodosReisBecker 谢谢!如果它可以在单个 TFDQuery 中执行,则可以接受,只要它不需要我检查是否 FDQuery1.RowsAffected=1 then {... execute 2nd part of query } 再次...
  • 我想等价的将在 MySQL 中使用 IF SELECT ROW_COUNT()=1 ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
相关资源
最近更新 更多