PostgreSQL上的UniDac:插入后串行(自动递增)字段没有值



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

对于autoincrement字段,我们使用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
...

有可能解决这个问题吗?

当您创建串行类型的字段时,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将从此序列中填充。

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.

相关内容

  • 没有找到相关文章

最新更新