2016-02-09 79 views
2

我使用FireDac與Oracle 12c數據庫和Delphi西雅圖。Delphi FireDac - 在覆蓋帖子更新後獲得自動遞增的值

我有一個Employee表

EmployeeID - NUMBER GENERATED ALWAYS AS IDENTITY 
HireDate - Date 

在我的形式,我有一個FDQuery用下面的語句:

select * from Employee 

後FDQuery1.Insert和FDQuery1.Post我可以用產生的僱員以下代碼:

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

回答

0

By Dmitry Arefiev from the Embarcadero Discussion Forum:在 你FDUpdateSQL1.InsertSQL NEW_EmployeeID:

嘗試使用INSERT ... RETURNING INTO僱員。您還需要設置:NEW_EmployeeID 這樣的參數:

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

很高興你得到了他的關注。 – MartynA

+0

再次感謝您證明與他們論壇的鏈接。非常有用的信息。順便說一句Dimitry看起來像一個很棒的傢伙。 – Tommy

+0

大概這就是爲什麼EMBA將他的產品帶入內部; =) – MartynA