【问题标题】:FireDAC equivalent of DBExpress briefcase model相当于 DBExpress 公文包模型的 FireDAC
【发布时间】:2016-01-26 01:33:11
【问题描述】:

我一直在使用 DBExpress 连接到各种数据库(主要是 MSSQL、Sybase SQL):

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

【问题讨论】:

  • 只需将 FDQuery 与 CachedUpdates = True 一起使用
  • @da-soft 谢谢——我天生的偏执不让我接受它会那么容易。是否有可能影响性能的“LogChanges:=false”等效项?

标签: delphi-xe8 dbexpress firedac


【解决方案1】:

有一个更简单的方法。使用 FDMemTable 的 CopyDataSet 方法。这将复制数据和元数据。 FDMemTable 的更改不会写入基础数据集,内部计算字段(和计算字段)也将被复制,但您必须连接 OnCalcFields 事件处理程序。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2012-12-03
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多