如本人上一篇博客《FireDAC 学习 - 7:三层数据库,一次传递多个表的数据》所说,可以一次性获取多个表的数据到客户端。
在客户端编辑完成后,同样可以一次性提交客户端的 Delta 到服务器端,最后提交给数据库服务器。先看代码:
procedure TDataModule2.ApplyUpdates;
var
AStream: TMemoryStream;
begin
{----------------------------------------------------------------------------
主从表,多个表的数据,从客户端传递 Delta 到服务器端提交,测试通过。
注意:FdMemTable 的 CachedUpdates 属性必须是 True
看起来,FDSchemaAdapter 的作用很大,其中一个作用就是打包多个表的数据。
----------------------------------------------------------------------------}
AStream := TMemoryStream.Create;
try
FDSchemaAdapter3.ResourceOptions.StoreItems := FDSchemaAdapter3.ResourceOptions.StoreItems - [siData];
FDSchemaAdapter3.SaveToStream(AStream, TFDStorageFormat.sfBinary);
if FdQuery1.Active then FdQuery1.Close;
if FdQuery2.Active then FdQuery2.Close;
AStream.Position := 0;
FDSchemaAdapter1.LoadFromStream(AStream, TFDStorageFormat.sfBinary);
FDSchemaAdapter1.ApplyUpdates(0);
finally
AStream.Free;
FDSchemaAdapter3.ResourceOptions.StoreItems := FDSchemaAdapter3.ResourceOptions.StoreItems + [siData];
end;
end;
上述代码使用到的数据库控件的配置方式,和 《FireDAC 学习 - 7:三层数据库,一次传递多个表的数据》里讲的相同。本篇文章是基于上一篇博客相同的工程代码。
再次看看上一篇博客中如何一次性从服务器端获取多个表的数据到客户端:
procedure TDataModule2.OpenTables;
var
AStream: TMemoryStream;
begin
{----------------------------------------------------------------------------
主从表,多个表的数据,一次传递到客户端,测试通过。
1. 服务器端,FdQuery1, FdQuery2 都共用一个 FDSchemaAdapter1,
FDSchemaAdapter1.SaveToStream 就在一个 Stream 里同时输出了两个表的数据。
2. 客户端,FdMemTable31 和 FdMemTable32 都通过 FDSchemaAdapter3.LoadFromStream 方法加载数据。
2.1. 这里需要 FDMemTable31.Adapter := FDTableAdapter31;
2.2. FDTableAdapter31.SchemaAdapter := FDSchemaAdapter3; 另外一个也一样;
2.3. FDTableAdapter31.DatSTableName := FdQuery1; 另外一个也一样。
需要注意上述名字,一定要是服务器端的 FdQuery 的名字。不能乱改。
----------------------------------------------------------------------------}
if FdQuery1.Active then FdQuery1.Close;
if FdQuery2.Active then FdQuery2.Close;
FDQuery1.Open();
FDQuery2.Open();
AStream := TMemoryStream.Create;
try
FDSchemaAdapter1.SaveToStream(AStream, TFDStorageFormat.sfBinary);
AStream.Position := 0;
FDSchemaAdapter3.LoadFromStream(AStream, TFDStorageFormat.sfBinary);
finally
AStream.Free;
end;
end;
结论:
通过上述两段代码可以看出来,使用 FDSchemaAdapter 可以将多个表的数据打包输出。
如果我们将打包输出的数据,格式设置为 XML 或者 JSON,则可以直接看到数据以及编辑过的数据是如何打包在一起的。
输出为 JSON 的代码如下:
function TDataModule2.GetMemDataJson: string;
var
AStream: TStringStream;
begin
AStream := TStringStream.Create;
try
FDSchemaAdapter3.SaveToStream(AStream, TFDStorageFormat.sfJSON);
Result := AStream.DataString;
finally
AStream.Free;
end;
end;
看起来,在三层里面使用 FireDAC,确实可以不使用 MIDAS 框架以及 ClientDataSet 了。