我有一个返回带有外连接的行的查询。这会导致记录存在于表中不存在的结果中。更改这些行后,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;