1

使用 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 进行正常的追加/设置字段/发布构造可以正常工作。

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

4

1 回答 1

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;
    
于 2019-09-12T20:07:56.357 回答