0

我有一个查询,它返回带有外连接的行。这会导致结果中存在的记录实际上并不存在于表中。当这些行发生更改时,FireDac 将更改视为更新而不是插入。从 FireDac 的角度来看,这种行为是有道理的,因为它无法区分。

我正在重写 OnUpdateRecord 事件以捕获那些标记为错误的行并自己执行插入。那部分工作得很好。我想不通的是如何告诉 FireDac 在其他记录上执行它的正常过程。我想我可以将 AAction 设置为 eaDefault 并且在返回时 FireDac 将继续正常处理该行。然而,情况似乎并非如此。一旦 OnUpdateRecord 就位,FireDac 似乎永远不会对服务器进行任何更新。

有没有办法告诉 FireDac 更新当前行?通过调用某些东西在 OnUpdateRecord 函数中 - 或者可能是我错过的不同返回值?

否则有没有其他方法可以将这些更新更改为插入?我查看了更改 UpdateStatus ,但这是只读的。我查看了TFDUpdateSql - 但我无法弄清楚如何仅将更新转换为插入。

如果这有什么不同,我正在使用 CachedUpdates。

这是我的 OnUpdateRecord 函数:

procedure TMaintainUserAccountsData.QueryDrowssapRolesUpdateRecord(
  ASender: TDataSet; ARequest: TFDUpdateRequest; var AAction: TFDErrorAction;
  AOptions: TFDUpdateRowOptions);
{^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^}
begin
  if (ARequest = arUpdate) and VarIsNull(ASender.FieldByName('Username').OldValue) then
  begin
    ASender.Edit;
    ASender.FieldByName('RoleTypeID').Value := ASender.FieldByName('RealRoleTypeID').Value;
    ASender.Post;
    MGRDataAccess.ExecSQL('INSERT INTO DrowssapRoles (Username, RoleTypeID, HasRole) VALUES (:Username, :RoleTypeID, :HasRole)',
                          [ASender.FieldByName('Username').AsString, ASender.FieldByName('RoleTypeID').AsInteger,
                             ASender.FieldByName('HasRole').AsBoolean]);

    AAction := eaApplied;
  end
  else
  begin
    // What do I do here to get the default FireDac actions?
  end;
end;
4

0 回答 0