FireDAC是否支持执行条件SQL语句实现关联数据更新操作?
FireDAC条件SQL场景实现方案
完全可以使用FireDAC实现该需求,以下3种方案都可以将逻辑嵌入单条FDQuery执行,无需Delphi侧拆分控制:
方案1:数据库原生多语句条件执行(适配多数关系型数据库)
利用数据库自身的变量和判断语法封装逻辑,仅需开启FireDAC多语句执行权限即可:
- MySQL写法示例:
SET @row_affected = 0; DELETE FROM Invoices WHERE INVOICE=500; SELECT ROW_COUNT() INTO @row_affected; UPDATE Customers SET INVOICECOUNT=INVOICECOUNT-1 WHERE Customer=1 AND @row_affected = 1;
- SQL Server写法示例:
DECLARE @row_affected INT; DELETE FROM Invoices WHERE INVOICE=500; SET @row_affected = @@ROWCOUNT; IF @row_affected = 1 BEGIN UPDATE Customers SET INVOICECOUNT=INVOICECOUNT-1 WHERE Customer=1; END
使用要求:在FDConnection的参数中添加ExecuteOptions=eoMultiStatement开启多语句执行支持。
方案2:CTE绑定删除更新逻辑(无需多语句权限)
针对支持DML语句返回结果的数据库(PostgreSQL、SQL Server 2005+等),可以直接合并为单条合法SQL:
WITH deleted AS ( DELETE FROM Invoices WHERE INVOICE=500 RETURNING 1 ) UPDATE Customers SET INVOICECOUNT = INVOICECOUNT - 1 WHERE Customer = 1 AND EXISTS (SELECT 1 FROM deleted);
该方案不需要额外配置FireDAC参数,兼容性更高。
方案3:FireDAC内置脚本语法(跨数据库兼容)
如果需要适配多种数据库,可直接使用FireDAC原生的脚本判断语法,不需要适配不同数据库的SQL方言:
DELETE FROM Invoices WHERE INVOICE=500; {IF <FDQuery_Name>.RowsAffected = 1} UPDATE Customers SET INVOICECOUNT=INVOICECOUNT-1 WHERE Customer=1; {ENDIF}
使用要求:开启FDQuery的ScriptOptions属性中的脚本解析开关即可,无需编写额外Delphi控制代码。
内容的提问来源于stack exchange,提问作者Peter Jones
相关产品推荐
相关产品推荐

