gpt4 book ai didi

delphi - 在 Delphi XE2 上使用 UniDac 的 PostgreSQL 串行(自动增量)

转载 作者:行者123 更新时间:2023-11-29 12:38:09 27 4
gpt4 key购买 nike

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

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

代码:

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;

异常(exception)情况是:

Exception

字段“id”是 TIntegerField,而不是 TAutoIncrementField。

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

怎么可能解决呢?谢谢。

最佳答案

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

关于delphi - 在 Delphi XE2 上使用 UniDac 的 PostgreSQL 串行(自动增量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17810795/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com