2012-08-03

【Delphi】ClientDataSet 應用(1) - autoInc field

有時我們在後端 databasetable 會建立自動給值欄位(如 Postgresserial、bigserial),但因為 clientdataset 特性並不會立即向後端取值,如果這時自動給值欄位是個關鍵欄位(如 primary keyunique),這時若要一次增加數筆記錄,就會出錯了 -- 存入第一筆記錄會發現該自動給值欄位是空白(null) 的,要存入第二筆時就會出現 "key violation" 的錯誤 -- 因為 2 筆記錄的 tid 欄位 都是 null,導致 key violation。



先雙擊 clientdataset --> Add all fileds,然後注意 autoinc 欄位的 ReadOnly 屬性是 false


 
...
var
    Form2: TForm2;
    // 因為 database 給 autoInc 欄位的值是正值,
    // 所以我們給的暫時值採負值, 避免另一個 keyviolation 情況
    sid: integer = -1; 

implementation

{$R *.dfm}

procedure TForm2.cdsTableNewRecord(DataSet: TDataSet);
begin
    DataSet.FieldByName('tid').AsInteger := sid;
    Dec(sid);
end;

procedure TForm2.btnSaveClick(Sender: TObject);
begin
    // 在 applyupdate, 正式存入 database 後, 
    // 再將 sid 歸為 -1     
    if (cdsTable.ApplyUpdates(0)=0) then
    begin
        sid := -1;
        cdsTable.Refresh;    // 更新一下 取得 databaseset 給的正式值
    end;
end;
 





↑ 這裡我們給予 tabletid 欄位暫時的負值。



applyupdate 後,正式將資料存回 database,並向 database 取得新的實際的 tid 欄位的值。

沒有留言:

張貼留言