【问题标题】:Delphi FireDac - Get auto-incremented value after overriding post UpdatesDelphi FireDac - 覆盖帖子更新后获取自动增量值
【发布时间】:2016-02-09 18:15:17
【问题描述】:

我将 FireDac 与 Oracle 12c 数据库和 Delphi Seattle 一起使用。

我有一张员工表

EmployeeID - NUMBER GENERATED ALWAYS AS IDENTITY
HireDate - Date

在我的表单上,我有一个带有以下语句的 FDQuery:

select * from Employee

在 FDQuery1.Insert 和 FDQuery1.Post 之后,我可以使用以下代码获取生成的 EmployeeID:

  FDQuery1.Insert;
  ...
  FDQuery1.Post;
  ShowMessage(IntToStr(FDQuery1.FieldByName('EMPLOYEEID').AsInteger));

这很好用。

问题:

我现在想要覆盖 FDQuery 发布更新,如下所述: http://docwiki.embarcadero.com/RADStudio/XE8/en/Overriding_Posting_Updates_%28FireDAC%29

所以我覆盖了发布更新:

procedure TForm3.FDQuery1UpdateRecord(ASender: TDataSet;
  ARequest: TFDUpdateRequest; var AAction: TFDErrorAction;
  AOptions: TFDUpdateRowOptions);
begin
  FDUpdateSQL1.ConnectionName := FDQuery1.ConnectionName;
  FDUpdateSQL1.DataSet := FDQuery1;
  FDUpdateSQL1.Apply(ARequest, AAction, AOptions);

  AAction := eaApplied;
end;

但现在 EMPLOYEEID 显示为 -1 :(

  ShowMessage(IntToStr(FDQuery1.FieldByName('EMPLOYEEID').AsInteger));

我在 FDUpdateSQL1.InsertSQL 中输入什么语句并不重要。我什至可以把它留空。结果总是一样的。

https://forums.embarcadero.com/thread.jspa?messageID=778896&#778896 上也有人问过这个问题)

【问题讨论】:

    标签: delphi firedac


    【解决方案1】:

    By Dmitry Arefiev from the Embarcadero Discussion Forum:

    尝试使用 INSERT ... RETURNING EmployeeID INTO :NEW_EmployeeID in 你的 FDUpdateSQL1.InsertSQL。您还需要设置:NEW_EmployeeID 像这样的参数:

    with FDUpdateSQL1.Commands[arInsert].ParamByName('NEW_EmployeeID') do begin
      ParamType := ptOutput;
      DataType := ftInteger;
    end;
    

    【讨论】:

    • 很高兴你引起了他的注意。
    • 再次感谢您提供他们论坛的链接。这么多有用的信息。顺便说一句,Dimitry 看起来是个很棒的人。
    • 大概这就是 EMBA 将他的产品带入内部的原因;=)
    猜你喜欢
    • 2013-12-21
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多