【问题标题】:Leave Update Query Value Unchanged with ADOQuery and Delphi 10.2使用 ADOQuery 和 Delphi 10.2 保持更新查询值不变
【发布时间】:2020-07-06 09:15:07
【问题描述】:

我在 2 个相互交换数据的系统之间有一个接口。这是一个可以通过 GUI 修改的默认界面,例如您可以选择使用两边的一组字段,也可以选择保持原样。

现在在我的代码中有如下所示的 UPDATE SQL 查询

UPDATE TABLE1 SET
FIELD1_GROUP1=:FIELD1_GROUP1,FIELD2_GROUP1=:FIELD2_GROUP1,FIELD3_GROUP1=:FIELD3_GROUP1,
FIELD1_GROUP2=:FIELD1_GROUP2,FIELD2_GROUP2=:FIELD2_GROUP2,FIELD3_GROUP2=:FIELD3_GROUP2

ADOQuery.Parameters.ParamByName('FIELD1_GROUP1').Value := MyField1_Group1_From_SystemB;
....

现在,如果我选择不使用 GROUP2,则不可能不设置参数。我找到了一个适用于类似

的解决方案
if USE_GROUP2 then
begin
ADOQuery.SQL.add(FIELD1_GROUP2=:FIELD1_GROUP2,FIELD2_GROUP2=:FIELD2_GROUP2,FIELD3_GROUP2=:FIELD3
_GROUP2);
  ADOQuery.Parameters.ParamByName('FIELD1_GROUP1').Value := MyField1_Group1_From_SystemB;
  ...
end;

但是这种解决方案会在我的系统之间进行,以便在每个使用 SQL 的函数的开头看到完整的 SQL QUERY。它会将我们干净的代码分解成可读性差的块。

我想知道参数是否没有在其值内删除参数的功能。 感谢帮助

【问题讨论】:

  • 没有。如果您在查询中指定了一个以 : 开头的参数,那么这就是您的查询中的一个参数。如果您不想更新该值,请编写没有该参数的不同 SQL 语句。
  • 您使用的是哪个 DBMS?
  • 我正在使用 Firebird DB

标签: sql delphi tadoquery


【解决方案1】:

您可以在查询中使用合并来将字段更新为已有的值:

UPDATE TABLE1 SET
  FIELD1_GROUP1=COALESCE(:FIELD1_GROUP1, FIELD1_GROUP1) 
  ... 

但这有一些潜在的问题。

首先,很清楚,这将不再允许您将字段更新为 NULL。当然,您可以通过不使用 COALESCE 来解决这个问题,而是使用 CASE 检查一个额外的参数,该参数指示是否应该更新第 2 组。

其次,更难确定后果,具体取决于您使用的数据库,这可能会或可能不会影响触发器的执行方式和/或更新语句的行数的计算方式。这可能不会立即成为问题,但您可能会看到这会导致一整类难以调试的问题。

因此,虽然它可以成为一种解决方案,但我建议编写一个完全更新且仅更新您需要更新的字段的语句。这意味着有两个语句(一个包含 group2,一个不包含),或者根据您需要更新的内容动态构建 SQL。

我也喜欢有确切的 SQL,所以我更喜欢有两个明确的语句,但根据情况我可能会选择其他解决方案。这个决定取决于你。

【讨论】:

  • 对我来说这是一个很好的解决方案。在我的情况下,我喜欢传输的字段永远不会为 NULL,因此我不必将其设置为值。在我的情况下,我只需要使用 ADOQuery.Parameters.ParamByName('FIELD1_GROUP1').clear 将参数设置为 NULL,然后系统将保持“不变”的值。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
相关资源
最近更新 更多