unitable lastinsertid

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Закрыто
DYUMON
Сообщения: 34
Зарегистрирован: Чт 05 июл 2012 05:21
Откуда: Новосибирск
Контактная информация:

unitable lastinsertid

Сообщение DYUMON » Пн 05 авг 2013 10:54

Доброго времени суток. Такой вопрос.
Можно ли при использовании Unitable в работе с Postgresql получать значение автоинкрементного поля с помощью с unitable.lasinsertid ? я попробовал оно возвращает 0.
или лучше стоит использовать uniquery для добавления записей?

DemetrionQ
Devart Team
Сообщения: 51
Зарегистрирован: Пн 28 янв 2013 11:54

Re: unitable lastinsertid

Сообщение DemetrionQ » Вт 06 авг 2013 14:12

Здравствуйте.

Спасибо за Ваше сообщение, мы воспроизвели проблему с LastInsertId и занимаемся её изучением. Мы сообщим Вам, когда у нас появятся какие-либо результаты.

Для автоматического заполнения полей в PostgreSQL сервере обычно используют последовательности
http://www.postgresql.org/docs/9.1/stat ... uence.html
или псевдо-тип serial
http://www.postgresql.org/docs/9.1/stat ... YPE-SERIAL .
Если Вам необходимо, чтобы при вставке новой записи в dataset поля заполнялись автоматически, Вы можете сделать это одним из следующих способов:

1) если Вы используете serial тип, или в качестве значения по умолчанию для поля выбрана последовательность, то Вам достаточно установить свойство TUniTable.Options.DefaultValues в True, например:

Код: Выделить всё

  UniTable1.Options.DefaultValues := True;
2) если значение по умолчанию для поля не является последовательностью или не задано, Вы можете явно указать имя последовательности (в свойстве TUniTable.SpecificOptions.Values['PostgreSQL.KeySequence']) и имя поля (в свойстве TUniTable.KeyFields), например:

Код: Выделить всё

  UniTable1.KeyFields := 'id';
  UniTable1.SpecificOptions.Values['PostgreSQL.KeySequence'] := 'table1_id_seq';
Если же Вам необходимо напрямую обратиться к последовательности, чтобы получить её текущее значение или изменить его, Вы можете использовать специальные PostgreSQL команды http://www.postgresql.org/docs/9.1/stat ... uence.html .

DYUMON
Сообщения: 34
Зарегистрирован: Чт 05 июл 2012 05:21
Откуда: Новосибирск
Контактная информация:

Re: unitable lastinsertid

Сообщение DYUMON » Ср 07 авг 2013 05:52

попробовал так

Код: Выделить всё

Uniquery1.Options.DefaultValues := True;
при добавление записи через

Код: Выделить всё

uniquery1.append;
в таблице появлияется строчка с кодом 10 но если сделать

Код: Выделить всё

uniquery1.post
то этой строчке присваивается номер 11, тоесть получается записи начинают проскакивать через одну

DemetrionQ
Devart Team
Сообщения: 51
Зарегистрирован: Пн 28 янв 2013 11:54

Re: unitable lastinsertid

Сообщение DemetrionQ » Чт 08 авг 2013 09:42

Такое поведение возникает в следующих ситуациях:
- вы используете оба вышеуказанных способа автоматического заполнения полей;
- вы создали триггер, который при вставке записи заполняет поле с помощью последовательности, и при этом используете один из вышеуказанных способов автоматического заполнения полей.

DemetrionQ
Devart Team
Сообщения: 51
Зарегистрирован: Пн 28 янв 2013 11:54

Re: unitable lastinsertid

Сообщение DemetrionQ » Пт 30 авг 2013 14:24

Здравствуйте.
Мы исправили проблему с LastInsertId. Исправление будет доступно в следующей версии UniDAC.

Примечание: Для PostgreSQL свойство LastInsertId возвращает не значение автоинкрементного поля - это свойство возвращает OID для последней вставленной записи, если таблица создана с опцией WITH OIDS. Детальную информацию о OIDs вы можете прочесть в документации PostgreSQL http://www.postgresql.org/docs/9.2/stat ... e-oid.html

Закрыто