关于delphi:PostgreSQL上的UniDac:插入后串行(自动增量)字段无值

UniDac on PostgreSQL: no value on serial (autoincrement) field after insert

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

对于自动增量字段,我们使用的是serial PostgreSQL类型,在我的应用程序中,我不触摸该字段的值。
但是,在记录Post之后,字段的值为0。
另外,我从以下位置得到0:

1
Q := dmMain.aqrParts.LastInsertId;

如果我刷新数据集,记录将显示为已填充的串行字段值,但对用户来说并不方便,因为表有很多记录,并且要提取一些记录才能工作,因此用户需要设置很多过滤器。

我使用数据集的这种属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  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
...

有可能解决这个问题吗?


当您创建具有序列类型的字段时,PostgreSQL服务器会自动创建一个序列,并且该序列中的值将用作该字段的默认值

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

1)设置

1
aqrParts.Options.DefaultValues := True.

在这种情况下,Id字段的默认值将设置为" nextval(''parts.spareparts_seq'':: regclass)",并且ID字段将自动填充。

2)设置

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

在这种情况下,将根据此序列填充字段ID。


有关PostgreSQL序列操作函数的本页建议您在插入之前,可以使用nextval函数获取identity / autoincrement / sequence字段的下一个值。因此,您可以先获取此保证的唯一值,然后在用户开始输入任何其他字段值之前将其显示在表单上,??最后将这个值显式包括在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.