2015-10-26 8 views
1

Я использую DBEXPRESS подключения к различным базам данных (в основном MSSQL, Sybase SQL) с:FireDAC эквивалент DBEXPRESS портфель модели

SQLConnection -> SQLDataSet -> DataSetProvider -> ClientDataSet.

Мне нужно подключиться к базам данных таким образом, чтобы они не записывали изменения обратно в таблицы.

Итак, DataSetProvider имеет ResolveToDataSet: = false, а ClientDataSet имеет LogChanges: = false (для производительности).

При использовании я подключаю SQLConnection, открываю ClientDataSet и закрываю SQLConnection.

Затем я могу манипулировать ClientDataSet, не опасаясь изменить базовую таблицу.

Я новичок в FireDAC (XE8), и я ищу, чтобы установить такой же сценарий - загружать данные в память из SQL-запроса и безопасно манипулировать этими данными в памяти без случайного обновления исходной таблицы (с).

настоящее время я использую: FDConnection -> FDQuery и FDMemTable

FDQuery имеет CachedUpdates: = True и я выполняю:

FDQ.Open; 
FDQ.FetchAll; 
FDMemT.CloneCursor(FDQ,true,false); 
FDQ.Close; 

Я думаю это довольно много эквивалент - Я получаю данные в FDMemTable, так что редактирование данных не сможет «записывать обратно» в таблицы.

Еще одна проблема - в сценарии dbExpress я часто добавляю поля InternalCalc в ClientDataSet. Мне не ясно, что я могу это сделать (и иметь постоянные имена полей), если я выполняю операцию CloneCursor.

Есть ли более простой способ обеспечения того, чтобы данные никогда не обновляли базу данных? Установка FDQuery в режим «только для чтения» не работает - мне часто приходится изменять записи (но не пытайтесь сохранять эти изменения).

TIA.

EdB

+0

Просто используйте FDQuery с CachedUpdates = True –

+0

@ да-мягкие Благодарности - моя естественная паранойя не позволил мне принять это было бы так просто. Есть ли эквивалент «LogChanges: = false», который может повлиять на производительность? – edbored

+0

Прочитайте это: [Работа в автономном режиме] (http://docwiki.embarcadero.com/RADStudio/Seattle/en/Offlining_Connection_%28FireDAC%29), [Кэширование обновлений] (http://docwiki.embarcadero.com/RADStudio/Seattle/ен/Caching_Updates_% 28FireDAC% 29) –

ответ

1

Существует намного более простой способ. Используйте метод CopyDataSet FDMemTable. Это скопирует как данные, так и метаданные. Изменения в FDMemTable не будут записываться в базовый набор данных, а также будут скопированы внутренние поля вычислений (и вычисленное поле), хотя вам придется подключить обработчик событий OnCalcFields.

FDMemTable1.CopyDataSet(FDQuery1, [coStructure, coRestart, coAppend]);