2

在我的应用程序中,用户可以向数据库添加一些记录。我正在使用 UniDac 4.6.12 组件。

对于自动增量字段,我们使用的是serialPostgreSQL 类型,我没有在我的应用程序中触及该字段的值。但是,在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
...

有可能解决这个问题吗?

4

2 回答 2

3

当你创建一个 serial 类型的字段时,PostgreSQL 服务器会自动创建一个序列,并且这个序列中的值将作为这个字段的默认值

要自动填写 ID 字段,您可以使用两种方式:

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 将从该序列中填充。

于 2013-08-02T05:46:24.753 回答
1

PostgreSQL Sequence Manipulation Functions上的此页面建议您可以在 insert 之前nextval使用该函数获取 identity/autoincrement/sequence 字段的下一个值。因此,您可以首先获得这个保证唯一值,然后在用户开始输入任何其他字段值之前将其显示在表单上,​​最后在插入语句中显式包含此值。

引用有关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.

于 2013-08-02T05:08:25.053 回答