【问题标题】:Delphi Firedac Memory TablesDelphi Firedac 内存表
【发布时间】:2016-05-04 01:07:38
【问题描述】:

我正在尝试用 Firedac MemoryTables 替换 Delphi ClientDatasets,它工作得很好,但在处理大数据时速度很慢 我在数据模块中创建了一个 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));`     

【问题讨论】:

  • 嗨,欢迎来到 StackOverflow。你不是忘了问一个问题吗?你应该编辑你的问题,否则它会因为不清楚而被关闭。

标签: delphi firedac


【解决方案1】:

那是你的真实代码吗?它是完整的吗?您连续两次调用 CreateDataSet

DataForm.mtDebTran.CreateDataSet
DataForm.mtDebTran.CreateDataSet;

没有明显的原因,但无论如何,如果您的 mtDebTran 数据集应该在第一次调用 CreateDataSet 之前包含数据,那么该调用将清空它,因为这是它应该做的。

您说“但它在打开后返回一个空表。”大概你打算问为什么会这样。嗯,在

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

在调用 .Close 之后,mtDebTran 将不包含任何数据,因为 DataSet 在调用 .Close 时会丢弃其数据,并且调用 .Open 不会恢复它 - 数据集仍然是空的。要获取数据,您需要从 .SaveToFile 中创建的文件中重新加载数据。当然,或者不首先调用 .Close。

顺便说一句,在您的代码中,mtDebTran 是 DataForm 的成员,但在您的 q 的文本中。你说“我在数据模块中创建了一个 FireDac 内存表”,所以大概 FireDac 表与 mtDebTran 不同?

顺便说一句,如果 mtDebTran 实际上是一个 TClientDataSet,那么在您的 q 中提及 FireDac 表及其标题是不相关且具有误导性的。

【讨论】:

  • 我的意思是我正在用内存表替换 ClientDatasets。使用 ClientDataSets,您可以打开以前保存的文件。
  • 两次调用 CreateDataset 只是问题中的输入错误。这是我提出的第一个问题,对于呈现代码的方式仍然很新。我的意思是我正在用内存表替换 ClientDatasets。使用 ClientDataSets,您可以打开以前保存的文件。感谢您指出我必须在打开现有文件后在 FireDac 中调用 LoadFromFile。工作 100%。谢谢
  • 很高兴它对你有用。请随时通过单击 LHS 上的“勾号”图标来“接受”答案 - 这向未来的读者表明您对它作为您的 q 的答案感到满意。
猜你喜欢
  • 2020-03-08
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 2021-06-13
  • 1970-01-01
相关资源
最近更新 更多