2013-08-01 108 views
1

在我的應用程序後,用戶對串口(自動增量)字段沒有值有一些記錄添加到數據庫中的能力。 我使用的是UniDac 4.6.12組件。UniDac PostgreSQL的:插入

自動增量領域,我們正在使用serial PostgreSQL的類型,我不會在我的應用程序輕觸此字段的值。 但是,記錄的Post後,字段的值爲0 另外,我從得到0:

Q := dmMain.aqrParts.LastInsertId; 

如果我刷新數據集,記錄會出現填充序列字段值,但它是不舒服用戶的方式,因爲表有很多的記錄,並獲取一些記錄工作,爲用戶設置了很多過濾器。

我使用這種數據集的屬性:

object aqrParts: TUniQuery 
    Connection = psqlConnection 
    SQL.Strings = (
     'SELECT * FROM parts.spareparts' 
     'LIMIT 200') 
    SpecificOptions.Strings = (
     'PostgreSQL.UnpreparedExecute=True') 
    BeforePost = aqrPartsBeforePost 
    AfterPost = aqrPartsAfterPost 
    Left = 32 
    Top = 72 
    object aqrPartsId: TIntegerField 
     AutoGenerateValue = arAutoInc 
     FieldName = 'id' 
     Visible = False 
    end 
... 

是否有可能解決這個問題?

回答

2

當您創建與串行類型的字段,PostgreSQL服務器會自動創建一個序列,並從該序列值將作爲默認此字段

自動填寫編號字段,你可以使用兩種方法:

1)設置

aqrParts.Options.DefaultValues := True. 

在這種情況下,Id字段的默認值將設置爲「nextval(''parts.spareparts_seq'':regclass)」,Id字段將自動填充。

2)設置

aqrParts.SpecificOptions.Values['KeySequence'] := 'spareparts_seq'; 
    aqrParts.SpecificOptions.Values['SequenceMode'] := 'smInsert'; 

在這種情況下字段Id將從該序列被填充。

1

此頁面上PostgreSQL Sequence Manipulation Functions建議您可以使用nextval功能插入之前得到身份/自動增量/序列字段的下一個值。因此,您可以首先獲得此保證的唯一值,然後在用戶開始輸入任何其他字段值之前將其顯示在表單上,​​最後將該值顯式包含在insert語句中。從文檔

報價上nextval功能

Advance the sequence object to its next value and return that value. This is done atomically: even if multiple sessions execute nextval concurrently, each will safely receive a distinct sequence value.