Таблицы памяти Delphi Firedac

Я пытаюсь заменить Delphi ClientDatasets, который работал нормально, но очень медленно с большими данными, с помощью Firedac MemoryTables. Я создаю таблицу памяти FireDac в модуле данных и заполняю ее из формы. В форме я проверяю количество записей в таблице памяти, и она содержит записи. Затем я закрываю таблицу памяти и снова открываю ее, но после открытия она возвращает пустую таблицу.

Dataform.mtDebTran.FileName := CdsDir + '/DebTran.Fds';
DataForm.mtDebTran.CreateDataSet
DataForm.mtDebTran.CreateDataSet;
DataForm.mtDebTran.Open;
DataForm.BuildDebTranTemp1(P1,P2,P3,P4,True,True);
DataForm.mtDebTran.SaveToFile(CdsDir + '/DebTran',sfBinary);
ShowMessage(IntToStr(DataForm.mtDebTran.RecordCount));
DataForm.mtDebTran.Close;
DataForm.mtDebTran.Open;
ShowMessage(IntToStr(DataForm.mtDebTran.RecordCount));`     

person Gerhard    schedule 27.01.2016    source источник
comment
Привет, добро пожаловать в StackOverflow. Не забыли задать вопрос? Вам следует отредактировать свой вопрос, иначе он будет закрыт как неясный.   -  person philant    schedule 27.01.2016


Ответы (1)


Это ваш настоящий код и закончен ли он? Вы вызываете CreateDataSet дважды подряд

DataForm.mtDebTran.CreateDataSet
DataForm.mtDebTran.CreateDataSet;

без видимой причины, но в любом случае, если ваш набор данных mtDebTran должен был содержать данные до первого вызова CreateDataSet, этот вызов очистит его, потому что это то, что он должен делать.

Вы говорите «но после открытия возвращает пустую таблицу». и, вероятно, вы хотели спросить, почему это так. Ну в

DataForm.mtDebTran.Close;
DataForm.mtDebTran.Open;

после вызова .Close, mtDebTran не будет содержать данных, потому что DataSet отбрасывает свои данные при вызове .Close и вызове .Open не восстановит его - набор данных по-прежнему будет пустым. Чтобы получить данные, вам необходимо перезагрузить данные из файла, созданного в .SaveToFile. Или не называть .Закрыть в первую очередь, конечно.

Кстати, в вашем коде mtDebTran является членом DataForm, но в тексте вашего q. вы говорите: «Я создаю таблицу памяти FireDac в модуле данных», поэтому, по-видимому, таблица FireDac отличается от таблицы mtDebTran?

Также, кстати, если mtDebTran на самом деле является TClientDataSet, то упоминание таблиц FireDac в вашем q и его заголовке неуместно и вводит в заблуждение.

person MartynA    schedule 27.01.2016
comment
Я имел в виду, что заменяю ClientDatasets таблицами памяти. С помощью ClientDataSets вы можете просто открыть предыдущий сохраненный файл. - person Gerhard; 28.01.2016
comment
Двойной вызов CreateDataset был просто опечаткой в ​​вопросе. Это первый вопрос, который я задал, будучи еще новичком в способе представления кода. Я имел в виду, что заменяю ClientDatasets таблицами памяти. С помощью ClientDataSets вы можете просто открыть предыдущий сохраненный файл. Спасибо, что указали, что я должен вызвать LoadFromFile в FireDac после открытия существующего файла. Работает на 100%. Спасибо - person Gerhard; 28.01.2016
comment
Рад, что это сработало для вас. Пожалуйста, не стесняйтесь принять ответ, щелкнув значок галочки на LHS - это сигнализирует будущим читателям, что вы удовлетворены им в качестве ответа на свой вопрос. - person MartynA; 28.01.2016