FireDAC 学习 - 7:三层数据库,一次传递多个表的数据
需求在 MIDAS 架构下,主从表可以采用嵌套表的方式,一次性将多个嵌套的表的数据传递到客户端。假设有主从表 FdQuery1 和 FdQuery2,大致做法如下:1. 在服务器端,FdQuery1 和 FdQuery2 分别对应数据库服务器里面的一个表。它们对应的表有主从关系,主表的主键字段名为 ID;从表的外键字段名也是 ID;2. 服务器端,DataSource1 对应 FdQuery1。3
需求
在 MIDAS 架构下,主从表可以采用嵌套表的方式,一次性将多个嵌套的表的数据传递到客户端。假设有主从表 FdQuery1 和 FdQuery2,大致做法如下:
1. 在服务器端,FdQuery1 和 FdQuery2 分别对应数据库服务器里面的一个表。它们对应的表有主从关系,主表的主键字段名为 ID;从表的外键字段名也是 ID;
2. 服务器端,DataSource1 对应 FdQuery1。
3. FdQuery2 的 SQL 语句大概是:select * from Table2 where ID=:ID;
4. FdQuery2.MasterSource := DataSource1;
5. 服务器端放一个 DataSetProvider1,其 DataSet 为 FdQuery1; 到这里,通过 DataSetProvider1 输出给客户端的数据是一个嵌套表,也就是一次性输出了2个表(可以是多个嵌套表)。
6. 客户端,ClientDataSet1 的 ProviderName 设置为服务器端的 DataSetProvider1;
7. 客户端,设计期,双击 ClientDataSet1 弹出字段编辑框,此框的右键菜单里面有 Add All Fields 则会在里面增加字段。这些字段里面除了 FdQuery1 对应的表的所有字段,还多出来一个字段。这个字段其实就是嵌入在里面的从表。字段名就是 FdQuery2。
8. 客户端,设计期,ClientDataSet2 的 DataSetField 为上述的那个 FdQuery2 字段,双击 ClientDataSet2 弹出字段编辑框,右键菜单选择 Add All Fields 则从表(也就是 FdQuery2 对应的表)的所有字段加载进来。
9. 运行期,如果从 DataSetProvider1.GetRecords 方法获得的数据包(数据类型是 OleVariant)传递到客户端,将 ClientDataSet1.Data := 上述从服务器端获得的数据包; 则 ClientDataSet2 也同时有了数据。
在 FireDAC 架构下,我暂时还没搞清楚如何从 FdQuery 里面获得嵌套式主从数据。
但 FireDAC 可以将多个表的数据(无关是否嵌套)一次性输出给客户端。然后通过在客户端建立主从关系的办法来显示嵌套表的主从关系。
--------------- FireDAC 一次输出多个表的数据到客户端 --------------------
FireDAC 的实现方法
1. 和前面一样,服务器端 FdQuery1 和 FdQuery2 分别对应数据库服务器的两个表。
2. 拖一个 FDSchemaAdapter1 过来。将 FdQuery1 和 FdQuery2 的 SchemaAdapter 属性都指向 FDSchemaAdapter1;
3. 输出数据,代码如下:
FDSchemaAdapter1.SaveToStream(AStream, TFDStorageFormat.sfBinary);
4. 上述 AStream 就是服务器端输出的数据,同时包含了 FdQuery1 的数据和 FdQuery2 的数据。将这个数据传递到客户端以后,
5. 客户端,拖一个 FDSchemaAdapter3;
6. 客户端,拖两个 FDTableAdapter31 和 FDTableAdapter32;
7. 设置 FDTableAdapter31 和 FDTableAdapter32 的 SchemaAdapter 为 FDSchemaAdapter3;
8. 设置 FDTableAdapter31.DatSTableName 属性为 FdQuery1, FDTableAdapter32 的该属性为 FdQuery2。这里的名字一定要和服务器端的 FdQuery1 和 FdQuery2 的名字对应上,不能错,不能随便取名字。
9. 拖两个 FDMemTable31 和 FDMemTable32,分别设置其 Adapter 属性为 FDTableAdapter31 和 FDTableAdapter32;
10. 做好上述设置后,执行代码如下:
FDSchemaAdapter3.LoadFromStream(AStream, TFDStorageFormat.sfBinary);
也就是说,通过 FDSchemaAdapter3 加载 AStream 就可以同时为两个 FdMemTable 装载来自服务器端的数据。
11. 在客户端拖两个 DataSource31 和 DataSource32 过来分别对应 FDMemTable31 和 FDMemTable32;
12. 在客户端拖两个 DBGrid1 和 DBGrid2 过来对应上述两个 DataSource。
13. 到这里,运行代码,则可以在两个 DBGrid 里面看到客户端装载进来的数据。这里看到的从表的数据是全部数据,而不是类似 MIDAS 架构下嵌套表的主从数据。
14. 想要在 DBGrid 里面看到主从数据,设置 FDMemTable32 的几个属性:
14.1. MasterSource 为 DataSource31;
14.2. MasterFields 为 ID (关联的外键字段名);
14.3. IndexFieldNames 为 ID;如果不设置这个,从表 DBGrid 依然显示全部记录而不是跟随主表显示被主表的 ID 记录过滤后的记录。
15. 到这里,运行时客户端界面上两个 DBGrid 能够看到两个表的数据,而且是主从(Master - Detail)关系。
到这里,三层数据库在 FireDAC 底下如何一次从服务器端获得多个表的数据,方法已经搞定。如何将客户端的多个表的数据一次性提交过去(尤其是主从表,需要一次性提交,才能在服务器端的同一个交易里面搞定),下次再说。
更多推荐
所有评论(0)