Delphi FireDAC 在 CachedUpdateMode 中处理新的详细记录

问题描述 投票:0回答:1

我在

MariaDB
标准化表中命名为

L1MasterTable
带柱子

  • id
  • 名字
  • 姓氏
  • 电子邮件

L2AddressTable
带柱子

  • id
  • pid
  • 城市
  • 街道
  • 国家

L3AddressDetailTable
带柱子

  • id
  • pid
  • 详细地址

表格之间有关系

  • L1MasterTable:L2AddressTable - 1:n
  • L2MasterTable:L2AddressTable - 1:n

Delphi
中,我有3个非常简单的FDQueries来管理上面的表

FDQuery1.Connection:=DataModule1.c; 
FDQuery1.SQL.Clear;
FDQuery1.SQL.Text:='SELECT id, name, surname, email from L1MasterTable';
DataSource1.DataSet:=FDQuery1;
FDQuery1.FetchOptions.Mode := fmAll;
FDQuery1.CachedUpdates:=true; //I am working in CachedUpdatesMode for all tables
DataModule1.FDQueryOpen(FDQuery1,'FDQuery1 initDB');

FDQuery2.Connection:=DataModule1.c; //detail ISU a grid vpravo
FDQuery2.CachedUpdates:=true;
FDQuery2.SQL.Clear;
FDQuery2.SQL.Text:='SELECT id, pid, City, Street, Country from L2AddressTable order by pid'; 
FDQuery2.FetchOptions.Mode := fmAll;
FDQuery2.FetchOptions.DetailCascade:=true; //needed to be treated as Master/Detail mode
DataSource2.DataSet:=FDQuery2;
DataModule1.FDQueryOpen(FDQuery2,'FDQuery2 initDB');

FDQuery3.SQL.Clear;
FDQuery3.Connection:=DataModule1.c;
FDQuery3.CachedUpdates:=true;
FDQuery3.SQL.Text:='SELECT id, pid, addressdetail from L3AddressDetailTable order by pid'; 
DataSource3.DataSet:=FDQuery3;
FDQuery3.FetchOptions.DetailCascade:=true;
DataModule1.FDQueryOpen(FDQuery3,'FDQuery3 initDB');

我的问题是: 例如,当我在

L1MasterTable
中创建一条记录以及在
L2MasterTable
L3MasterTable
中创建详细记录时,我该如何处理案例。在 CachedUpdateMode 有新记录 id <0. For example -1, -2, ... When I want to add new record in
L2MasterTable
我不知道如何处理父表中不存在的
id

在 Delphi 中使用 Firedac 处理这种情况的最佳实践是什么?

我必须提到我的 MariaDB 在 MyISAM 中工作,我无法直接在数据库中设置关系。

delphi firedac
1个回答
0
投票

所有请求的功能均由名为

FireDAC
TFDSchemaAdapter
组件提供。 该组件处理所有 id 分配。

Delphi 文档: https://docwiki.embarcadero.com/Libraries/Sydney/en/FireDAC.Comp.Client.TFDSchemaAdapter

示例: https://docwiki.embarcadero.com/CodeExamples/Athens/en/FireDAC.SchemaAdapterMemTable_Sample

或者 GitHub 上的示例: https://github.com/Embarcadero/RADStudio12Demos/tree/main/Object%20Pascal/Database/FireDAC/Samples/Comp%20Layer/TFDQuery/CachedUpdates/Centralized

非常简单的片段,显示数据保存执行数据库,一旦根据上面的手册设置了所有内容:

 if FDSchemaAdapter1.UpdatesPending then
  begin
    FDSchemaAdapter1.ApplyUpdates; //applies correct IDs to all binded queries
    FDQuery1.CommitUpdates;
    FDQuery2.CommitUpdates;
    FDQuery3.CommitUpdates;
  end;
© www.soinside.com 2019 - 2024. All rights reserved.