【问题标题】:PostgreSQL serial (autoincrement) with UniDac on Delphi XE2在 Delphi XE2 上使用 UniDac 的 PostgreSQL 串行(自动增量)
【发布时间】:2013-07-23 12:55:51
【问题描述】:

我正在使用 UniDAC 将我们的 Delphi XE2 应用程序从 MSSQL(使用 ADO 组件)迁移到 PostgreSQL。

在数据库中,有一些serial 类型的字段(自动增量)。当我追加记录时,我没有将任何数据放入此自动增量字段。以前,使用 MSSQL/ADO 它会自动运行,但现在我有一个例外。

代码:

aqrMsgs.Append;
aqrMsgsUser_From.AsInteger := UserId;
aqrMsgsUser_To.AsString := UserIds[I];
aqrMsgsSubject.AsString := Trim (edtSubject.Text);
aqrMsgsContents.AsString := mmoContents.Text;
aqrMsgsIsDone.AsBoolean := False;
aqrMsgs.Post;

例外是:

字段 'id' 是 TIntegerField,而不是 TAutoIncrementField。

顺便说一句,如果我使用 DBGrid 编辑功能(确切地说,我使用的是 ExpressQuantumGrid),将记录附加到具有相同结构的另一个表中,一切正常。

如何解决? 谢谢。

【问题讨论】:

    标签: delphi postgresql delphi-xe2 devart unidac


    【解决方案1】:

    1) 当你创建一个序列类型的字段时,PostgreSQL 服务器会自动创建一个序列,这个序列中的值将被用作该字段的默认值。如果插入新记录时未设置序列字段,则服务器从序列中获取一个值。但是如果你为序列字段设置了一个值,服务器会插入这个值。由于序列对您插入到序列字段的值一无所知,因此在进一步插入记录时(使用序列时),如果序列字段是使用唯一约束创建的,则可能会发生“重复键值”错误.如果您不手动设置此字段的值,则不会遇到此问题。

    2) UniDAC 可以使用序列自动填充字段。为此,您应该如下设置 TUniQuery.KeyFields 和 TUniQuery.SpecificOptions.Values['KeySequence'] 属性:

      UniQuery1.KeyFields := 'id'; 
      UniQuery1.SpecificOptions.Values['KeySequence'] := 'test1_id_seq';
    

    此外,使用 TUniQuery.SpecificOptions.Values['SequenceMode'] 属性,您可以指定 UniDAC 何时使用序列填充字段:调用 Append/Insert 或 Post。

    您可以在此处找到有关上述属性的详细信息: http://www.devart.com/unidac/docs/pgsqlprov_article.htm

    【讨论】:

      【解决方案2】:

      大多数符合 SQL 的方法是根本不在 SQL 查询中登记此字段,让它离开 NULL,然后通过 SQL Before Insert trigger 从 null 在服务器上将其填充为唯一值。

      如果UniDAC 具有像TUpdateSQL 这样的插入查询自定义功能,则可以这样做。

      手动指定INSERT查询(或INSERT-RETURNING,如果您以后出于任何原因需要ID:http://en.wikipedia.org/wiki/SQL_INSERT)是插入数据的最可控、最有效和最灵活的方式。


      但是,如果您执行 Append 并且不想为此编写 SQL 查询,那么您可以在执行 post 之前从服务器读取 ID 值。

      1) 声明跨事务ID来源:SQL SEQUENCE

      2) 发帖前查询nextval() 并将其放入ID 字段(您可以在TDataSet.BeforePost 事件处理程序中进行)


      您还可以阅读 UniDAC 文档并在 TUniTable 中查看一些与序列相关的属性,这些属性可以为您自动执行此过程。 KeySequence 和 SequenceMode http://www.devart.com/unidac/docs/pgsqlprov_article.htm#tuniquery_tunitable_tunistoredproc

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-07
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 2016-08-19
        • 2013-03-04
        • 2015-09-03
        • 1970-01-01
        相关资源
        最近更新 更多