【问题标题】:UniDac on PostgreSQL: no value on serial (autoincrement) field after insertPostgreSQL 上的 UniDac:插入后串行(自动增量)字段没有值
【发布时间】:2013-08-01 20:30:43
【问题描述】:

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

对于自动增量字段,我们使用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
...

有办法解决吗?

【问题讨论】:

    标签: delphi postgresql unidac


    【解决方案1】:

    当你创建一个序列类型的字段时,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 将从该序列中填充。

    【讨论】:

      【解决方案2】:

      PostgreSQL Sequence Manipulation Functions 上的此页面建议您可以使用nextval 函数在插入之前获取标识/自动增量/序列字段的下一个值。所以你可以先得到这个保证唯一的值,然后在用户开始输入任何其他字段值之前将它显示在表单上,​​最后在插入语句中显式地包含这个值。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 2015-10-14
        • 1970-01-01
        相关资源
        最近更新 更多