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

シリアル タイプのフィールドを作成すると、PostgreSQL サーバーは自動的にシーケンスを作成し、このシーケンスの値がこのフィールドのデフォルトとして使用されます。

Id フィールドを自動的に入力するには、次の 2 つの方法を使用できます。

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 シーケンス操作関数に関するこのページでは、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 に答える