【问题标题】:Making TJvAppDBStorage work with FireDAC/Firebird使 TJvAppDBStorage 与 FireDAC/Firebird 一起工作
【发布时间】:2019-09-09 19:51:17
【问题描述】:

使用 Delphi 10.2 或 10.3、FireDAC 和 Firebird 2.5 或 3.0:我使用 JVCL TJvAppStorage 组件已有多年,无论是 INI/XML 存储还是 AbsoluteDB 数据库中的表,我都没有遇到过问题.我正在尝试通过 FireDAC 将应用程序从 AbsoluteDB 迁移到 Firebird,但无法让 TJvAppDBStorage 写入条目 - 它不返回任何错误,但实际上没有任何内容写入表中。

我有一个数据模块,其中包含 FireDAC 连接和驱动程序组件、JvAppDBStorage、一个 TDataSource 和一个 TFDTable 组件。 FDB 存在包含适当的表,TFDTable 在该表上打开,JvAppDBStorage 的属性设置为匹配表的字段,并且 TFDTable、数据源和 JvAppDBStorage 正确链接。 (这一切都反映了 AbsoluteDB 的存在和工作。)调用 dmStorage.FBStorage.WriteString(dmStorage.FBStorage.ConcatPaths(['General', 'LastStarted']), FormatDateTime(StdDTFmtStr, Now));不会抛出任何异常,但实际上没有任何内容写入表中。通过 TFDTable 进行正常的追加/设置字段/发布构造可以正常工作。

任何帮助表示赞赏! 史蒂夫

【问题讨论】:

  • Steve,我只是想知道当 TJvAppStorage 执行其工作时,会施加什么事务控制(如果有的话)。如果您还没有看过this article,可以看看它。
  • Martyn,我认为您正在做一些事情 - TJvAppDBStorage 没有明确的事务处理。 Firebird 对交易很挑剔。感谢文章参考;我将进一步深入研究。
  • 后续:创建一个新的 TFDTransaction 对象并将其与 TJvAppDBStorage 对象正在使用的 TFDTable 关联消除了该问题。尝试从 TFDConnection 共享默认事务对象是行不通的,它必须是不同的实例。
  • 很高兴您找到了解决方案。为什么不将其作为答案发布(可以在 SO 上回答您自己的问题,2 天后您可以“接受”它们),这样未来的读者就会受益

标签: delphi jvcl


【解决方案1】:

这有 3 个关键部分:

  1. 基础表必须有一个 PK。我有一个 ID 列,其与插入前触发器的关联序列为我的 PK 创建一个 auto-inc 列,以及一个合并 SectionID 和 KeyID 字段的索引,以加快 Locate() 调用。

  2. 在创建 TFDTable 对象时,必须创建一个新的 TFDTransaction 对象并将其附加到 TFDTable 和 TFDConnection。

  3. 在 TFDTable 上,您必须将 UpdateOptions.UpdateMode 设置为 upWhereKeyOnly。如果您只执行前两个步骤,读取和追加将起作用,但编辑不会。

    function TFDDBMgr.MakeTableObj(const ATblName: String): TFDTable;
    begin
      Result := TFDTable.Create(Self);
      with Result do begin
        //hook up all our needed stuff
        Connection := Self.Connection;
        TableName := ATblName;
        CachedUpdates := False;
        {...}
    
        //!!.SS 09/11/19: REQUIRED for TJvAppDBStorage use, 
        //also requires that a PK be defined on the table
        UpdateOptions.UpdateMode := upWhereKeyOnly; 
        Transaction := TFDTransaction.Create(Result);
        Transaction.Connection := Self.Connection;
      end;
    end;
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2013-10-03
    • 2011-11-13
    • 2012-09-13
    • 2015-07-23
    • 2014-08-12
    • 2020-11-05
    相关资源
    最近更新 更多