Что и где нужно заполнить в TUniQuery, чтобы при добавлении новой записи в гриде, автоматически заполнялось ключевое поле (primary, autoincrement)?
P.S. т.е. когда вызывается метод insert/append
Автозаполнение ключевого поля при добавлении записи
Поэтому я и спрашиваю. У меня просто не заполняется. А вот в dbForgeStudio заполняется.
Вот снимок грида:
Вот скрипт создания таблицы:
У UniQuery заполнены поля UpdatingTable (tLimitsDetail) и KeyFields (id)
Запрос на insert (сгенерирован был автоматически):
В DataEditor тоже не заполняется:
Может я чего забыл?
Поле id_limits заполняется правильно, а id вообще не заполняется:
Options.DefaultValues устанавливал в True. Не помогает[/img]
Вот снимок грида:
Вот скрипт создания таблицы:
Код: Выделить всё
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;
Запрос на 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)
Может я чего забыл?
Поле id_limits заполняется правильно, а id вообще не заполняется:
Options.DefaultValues устанавливал в True. Не помогает[/img]
Добрый день.
Значение автоинкрементных полей в MySQL можно получить только после вставки записи в базу данных. Т.е. в вашем примере значение поля ID будет заполнено после вызова метода Post.
В dbForgeStudio for MySQL автоинкрементные поля заполняются "искусственно" путем получения метаинформации об автоинкрементном поле, величине прироста автоинкрементного поля и т.д. Вы можете в своем приложение организовать аналогичное поведение, заполняя поле ID в событии AfterInsert величиной Max(ID) + шаг автоинкремента. Мы такой функционал в UniDAC специально не реализовывали, т.к. считаем его не надежным. Если вы заполнили ID в событии AfterInsert величиной Max(ID) + шаг автоинкремента, то к моменту вызова Post, другой пользователь может вставить запись с этим же значением в БД, и вы получите ошибку (нарушение уникальности Primary Key).
Значение автоинкрементных полей в MySQL можно получить только после вставки записи в базу данных. Т.е. в вашем примере значение поля ID будет заполнено после вызова метода Post.
В dbForgeStudio for MySQL автоинкрементные поля заполняются "искусственно" путем получения метаинформации об автоинкрементном поле, величине прироста автоинкрементного поля и т.д. Вы можете в своем приложение организовать аналогичное поведение, заполняя поле ID в событии AfterInsert величиной Max(ID) + шаг автоинкремента. Мы такой функционал в UniDAC специально не реализовывали, т.к. считаем его не надежным. Если вы заполнили ID в событии AfterInsert величиной Max(ID) + шаг автоинкремента, то к моменту вызова Post, другой пользователь может вставить запись с этим же значением в БД, и вы получите ошибку (нарушение уникальности Primary Key).
Хорошо, генерирует такой запрос:
и получаем AV при Post
Код: Выделить всё
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'.