Автозаполнение ключевого поля при добавлении записи

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Ответить
Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Автозаполнение ключевого поля при добавлении записи

Сообщение Akella » Чт 19 апр 2012 14:09

Что и где нужно заполнить в TUniQuery, чтобы при добавлении новой записи в гриде, автоматически заполнялось ключевое поле (primary, autoincrement)?

P.S. т.е. когда вызывается метод insert/append

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Сообщение AndreyZ » Чт 19 апр 2012 15:22

При добавлении новой записи компонент TUniQuery автоматически заполняет ключевое автоинкремент поле значением полученным с сервера.

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Сообщение Akella » Чт 19 апр 2012 18:36

Поэтому я и спрашиваю. У меня просто не заполняется. А вот в dbForgeStudio заполняется.

Вот снимок грида:
Изображение


Вот скрипт создания таблицы:

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

CREATE TABLE tLimitsDetail(
  id INT(11) NOT NULL AUTO_INCREMENT,
  id_limits INT(11) NOT NULL,
  ex_count SMALLINT(6) DEFAULT NULL,
  common_count SMALLINT(6) DEFAULT NULL,
  frame_count SMALLINT(6) DEFAULT NULL,
  bold_count SMALLINT(6) DEFAULT NULL,
  remark VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = MYISAM
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci;
У UniQuery заполнены поля UpdatingTable (tLimitsDetail) и KeyFields (id)

Запрос на insert (сгенерирован был автоматически):

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

INSERT INTO tLimitsDetail
  (id, id_limits, ex_count, common_count, frame_count, bold_count, remark)
VALUES
  (:id, :id_limits, :ex_count, :common_count, :frame_count, :bold_count, :remark)
В DataEditor тоже не заполняется:


Может я чего забыл?
Изображение

Поле id_limits заполняется правильно, а id вообще не заполняется:
Изображение

Options.DefaultValues устанавливал в True. Не помогает[/img]

bork
Devart Team
Сообщения: 16
Зарегистрирован: Вт 06 сен 2011 09:22

Сообщение bork » Пт 20 апр 2012 09:40

Добрый день.

Значение автоинкрементных полей в MySQL можно получить только после вставки записи в базу данных. Т.е. в вашем примере значение поля ID будет заполнено после вызова метода Post.

В dbForgeStudio for MySQL автоинкрементные поля заполняются "искусственно" путем получения метаинформации об автоинкрементном поле, величине прироста автоинкрементного поля и т.д. Вы можете в своем приложение организовать аналогичное поведение, заполняя поле ID в событии AfterInsert величиной Max(ID) + шаг автоинкремента. Мы такой функционал в UniDAC специально не реализовывали, т.к. считаем его не надежным. Если вы заполнили ID в событии AfterInsert величиной Max(ID) + шаг автоинкремента, то к моменту вызова Post, другой пользователь может вставить запись с этим же значением в БД, и вы получите ошибку (нарушение уникальности Primary Key).

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Сообщение Akella » Пт 20 апр 2012 10:00

Хорошо, генерирует такой запрос:

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

INSERT INTO tLimitsDetail
  (id_limits, ex_count, common_count, frame_count, bold_count, remark)
VALUES
  (:id_limits, :ex_count, :common_count, :frame_count, :bold_count, :remark)

и получаем AV при Post
Project rp.exe raised exception class EDatabaseError with message 'Field 'id' must have a value'.

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Сообщение Akella » Пт 20 апр 2012 10:21

Эта ошибка возникает в том случае, если свойство Required у поля ID установлено в True
Спасибо. Вопрос решён.

Ответить