InterBase、FireBird 的自增字段和 FireDAC 數據庫控件

自增字段:

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 框架,請看這篇文章:

https://community.idera.com/developer-tools/b/blog/posts/auto-inc-fields-in-rad-server-with-interbase

我自己測試了一下,如果是傳統的3層架構,客戶端採用 TClientDataSet,則無法在客戶端實現自動自增。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章