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


  1.  
  2. ...
  3. var
  4. Form2: TForm2;
  5. // 因為 database 給 autoInc 欄位的值是正值,
  6. // 所以我們給的暫時值採負值, 避免另一個 keyviolation 情況
  7. sid: integer = -1;
  8.  
  9. implementation
  10.  
  11. {$R *.dfm}
  12.  
  13. procedure TForm2.cdsTableNewRecord(DataSet: TDataSet);
  14. begin
  15. DataSet.FieldByName('tid').AsInteger := sid;
  16. Dec(sid);
  17. end;
  18.  
  19. procedure TForm2.btnSaveClick(Sender: TObject);
  20. begin
  21. // 在 applyupdate, 正式存入 database 後, 
  22. // 再將 sid 歸為 -1
  23. if (cdsTable.ApplyUpdates(0)=0) then
  24. begin
  25. sid := -1;
  26. cdsTable.Refresh; // 更新一下 取得 databaseset 給的正式值
  27. end;
  28. end;
  29.  





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



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

沒有留言:

張貼留言