Сообщение FireDac Memtable в базу данных

Я новичок в FireDac и пытаюсь разобраться в компонентах. Раньше я использовал ClientDataSets, поэтому, думаю, я ожидаю аналогичной функциональности. У меня есть FDQuery в DataModule, и я хотел бы создавать представления этих данных во время выполнения. Раньше я бы сделал это, используя ClientDataSets и функцию CloneCursor. Это означало бы, что я могу работать с «независимым» набором данных, но при этом сохранять изменения в источнике.

Однако с FireDac я не могу этого сделать. Я попытался использовать CloneCursor в другом компоненте FDQuery, но получил ошибку подключения (поскольку он не клонирует эти свойства). Я частично заставил его работать с FDMemTable, где я могу клонировать и публиковать изменения в наборе данных, но для сохранения в БД я должен вызвать «ApplyUpdates» в исходном FDQuery.

Я упустил что-то, что мешает мне сохранить данные из FDMemTable прямо в БД, как ClientDataSet. Я пробовал применять обновления к FDMemTable, но безрезультатно.

Спасибо за ваше время


person Dudedolf    schedule 22.12.2014    source источник
comment
Я тоже застрял здесь. ApplyUpdates просто не работают.   -  person Tracer    schedule 28.02.2015
comment
я сразу же сделал что-то вроде FDmemtable.clonesource.applyupdates(0). Обнаружил это только неделю назад. Предпочли бы, чтобы он ниспадал каскадом. Надеюсь это поможет.   -  person Dudedolf    schedule 04.03.2015


Ответы (1)


Я работал над этой проблемой и обнаружил, что изменения в FDMemTable, клонированном из FDQuery, записываются обратно в базовую базу данных только в том случае, если 1) клонируемый FDQuery находится в режиме кэшированных обновлений и 2) вы вызываете ApplyUpdates для исходного FDQuery. Это согласуется с комментарием, который вы разместили на свой вопрос.

Если FDQuery не находится в режиме кэшированных обновлений и вы вызываете метод CloneCursor FDMemTable, клонируя FDQuery, данные в памяти синхронизируются между FDQuery и FDMemTable, но только изменения, сделанные исходным FDQuery, записываются в базовый база данных. Изменения, выполненные FDMemTable, видны FDQuery, но FDQuery не записывает их в базовую таблицу.

Если вы действительно хотите, чтобы любые опубликованные данные были немедленно записаны в базовую базу данных, вы можете добавить обработчики событий AfterPost, AfterDelete и AfterInsert к каждому участвующему набору данных и вызывать ApplyUpdates для исходного FDQuery из этих обработчиков событий (конечно, вы можете создайте только один обработчик событий и используйте его для событий AfterPost, AfterDelete и AfterInsert каждого набора данных).

person Cary Jensen    schedule 03.01.2017
comment
Спасибо - я не проверял, но, кажется, имеет смысл :) - person Dudedolf; 04.01.2017