自增字段:
InterBase 和 FireBird 數據庫,沒有自增字段這個字段類型。如果需要自增字段,辦法是:
1. 創建一個整數字段;
2. 創建一個生成器(Generator)。
這個 Generator 是 InterBase 和 FireBird 數據庫特有的。SQL Server DB 好像沒有這個東西。這個東西就是觸發一次,它返回一個加一的值。因此,可以通過觸發它獲得連續加一的值。把這個值填入整數字段,就成了自增字段。
使用方法:
在 Delphi 中,以前我使用自增字段,主要是在3層裏面,在客戶端 ClientDataSet 裏面使用。當時採用的辦法是在數據庫裏面增加一個存儲過程,由這個存儲過程來調用觸發 Generator 產生值,然後客戶端遠程調用服務器端的一個方法,服務器端的方法再去調用存儲過程獲得這個值。客戶端將獲得的值寫入 ClientDataSet 裏面相應的字段。
現在,FireDAC 有了新的屬性,可以讓我們直接使用這個 Generator,我做了一個實驗程序來測試這個新的方法。步驟如下:
1. 在 Delphi 裏面新建一個 VCL 工程,就一個 Form1,拖幾個控件,如圖:
上圖中,FDQuery1 連接了我的測試數據庫,語句是:select * from TESTDATA.fdb
測試數據庫裏面有一個表 TAB_AUTO, 裏面一個整數字段名爲 ID 和一個 varchar 字段用來隨便填寫字符串。
測試數據庫裏面我創建了一個 Generator 名爲 NEW_ID。
2. 選中這個 FDQuery1,在其屬性面板裏面找到 UpdateOptions 那一項,下拉開,找到裏面的3個屬性如圖:
2.1. 上圖中,AutoIncFields 的屬性填寫爲我的測試數據庫裏對應的自增字段名 ID。下拉就能顯示並選擇;
2.2. GeneratorName 下拉就能看到 NEW_ID 這個 Generator,選擇它。注意,下拉能自動看到,建立在 FDConnection1 已經連接數據庫的前提下。
2.3. FetchGeneratorsPoint 選擇 gpImmediate,默認不是這個值。如果不選,你可以自己試試效果如何。
3. 測試,在 DBGrid 裏面增加一條記錄,隨便填寫什麼,其 ID 字段會自動填入自增的值。
4. 如果想提交 DBGrid 裏面新增的記錄到數據庫,需要設置 FdQuery1 的屬性 CachedUpdates 爲 True,默認是 False。
4.1. 提交的代碼:FdQuery1.ApplyUpdates(0);
到此搞定這個測試。確實可以看到在 DBGrid1 裏面新增一條記錄,其 ID 字段裏面會自動填入由數據庫的 Generator 自動生成的順序整數值。
那麼,如果是3層,客戶端需要這個值,該怎麼做?如果這個3層是 DataSnap 框架,請看這篇文章:
我自己測試了一下,如果是傳統的3層架構,客戶端採用 TClientDataSet,則無法在客戶端實現自動自增。