DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: 851248662
今日帖子: 46
在线用户: 18
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 denis (Denis) ★☆☆☆☆ -
盒子活跃会员
2017/5/22 11:00:48
标题:
FDMemTable+FDQuery三层主从表问题 浏览:1239
加入我的收藏
楼主: 从网上看到新的内存表FDMemTable很牛,比ClientDataSet要好。想试试用FDMemTable+FDQuery做三层架构的应用,可是实际应用中单表操作没有问题,而主从表出现了问题,具体问题如下:

第一种方式:
服务端用 FDQuery  + FDSchemaAdapter 
主表 FDQuery1的sql: select * from tm1  DataSource1.DataSet: FDQuery1
从表 FDQuery2的sql: select * from td1 where tid = :mid  MasterSource: DataSource1
其它参数默认

客户端用 FDMemTable + FDTableAdapter + FDSchemaAdapter
主表 FDMemTable1  DataSource1.DataSet: FDMemTable1
从表  FDMemTable2  IndexFieldNames: tid  MasterFields: mid MasterSource: DataSource1   DataSource2.DataSet: FDMemTable2
其它参数默认

客户端从服务端读取数据后主表里有所有记录,而从表只有与主表第一条记录相关的数据,按理应该从表所有记录都有才对,是哪个参数设置不对还是FDQuery在服务端就是这样子,跟DataSetProvider工作原理不同,不能生成巢状主从表数据?

第二种方式:
服务端用 FDQuery  + FDSchemaAdapter 
主表 FDQuery1的sql: select * from tm1  DataSource1.DataSet: FDQuery1
从表 FDQuery2的sql: select * from td1  IndexFieldNames: tid  MasterFields: mid MasterSource: DataSource1
其它参数默认
客户端跟第一种方式一样
这种方式的情况是,主从表的语句要同步更改,如:主表语句改为: select * from tm1 where mid = 1 那么从表的sql语句也要改,不然从表会把表里所有的数据都读取出来,很多是用户不想要的数据,这肯定不是我们所想要的效果。

请教大家 FDMemTable+ FDTableAdapter+ FDQuery + FDSchemaAdapter 要想取代 ClientDataSet + AdoQuery或其它 + DataSetProvider 是不可能,还是我的程序不对?望高手指点。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2017/5/22 11:15:48
1楼: 用 RO + FireDAC
服务器函数 
proceudre 获取表(一些参数,例如 sql; var 数据:流);
begin
  FDQurey.Open(Sql);
  FDQurey.SaveTo流(数据, bin格式)
end;

客户端调用
var
  数据: 流
begin
  开始转菊花。
  Ro接口_Sync_Ex.Begin获取表(一些参数,
    procedure(const aRequest: IROAsyncRequest)
    var
    begin
      try
        aRequest.ReadResponse;
      except
       ON E: Exception do
        begin
          ShowMessage('发生错误' + E.Message);
          exit;
        end;
      end;
      A.End获取表(数据, aRequest);
      AFdMemTable.LoadFrom流(数据);
      停止菊花;
    end);
end;

这样 客户端调用主表一次 从表一次。

两个 FdMemTable 通过属性建立 主从表关系 即可。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 denis (Denis) ★☆☆☆☆ -
盒子活跃会员
2017/5/22 11:21:39
2楼: 主从表 用 RO + FireDAC 还是没有 ClientDataSet + DataSetProvider方便
主要的问题是如果主表是较复杂的sql语句(里面有很多查询条件),取从表的sql语句也复杂了,如果是多个从表,从表下面又有从表,ClientDataSet + DataSetProvider是很方便的。
----------------------------------------------
-
作者:
男 vmao (毛小毛) ★☆☆☆☆ -
盒子活跃会员
2017/5/22 12:54:41
3楼: 还是用kbmMW吧,这个和原来的Midas很接近,控制甚至比MIDAS还细致,而且效率也不差。我也是喜欢用数据绑定和巢状数据的人。能省很多事情。还可以分批自动读取。
----------------------------------------------
-
作者:
男 bigboy2050 (bigboy2050) ▲▲▲▲▲ -
注册会员
2017/5/22 14:32:54
4楼: 支持 毛小毛 大虾!
----------------------------------------------
http://www.kittyapp.net
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2017/5/22 14:40:56
5楼: 其实我只是演示,如何优雅的转菊花,还不用线程。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 vmao (毛小毛) ★☆☆☆☆ -
盒子活跃会员
2017/5/24 11:18:00
6楼: 5楼的转菊花异步是RO9以后才有的功能么?
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2017/5/24 12:23:46
7楼: 是的 新的异步模型。
旧的异步模型其实也可以用。

var
  数据: 流
begin
  开始转菊花。
  try
    try
      Ro接口_Async.Invoke_获取表(一些参数, 数据);
      while not Ro接口_Async.AnswerReceived do
      begin
        Ro接口_Async.AnswerReceivedEvent.WaitFor(1到10,建议 5);
        Application.ProcessMessages;
      end;
      Ro接口_Async.Retrieve_获取表(数据);
      AFdMemTable.LoadFrom流(数据);
    except
     on E: Exception do
     begin
        ShowMessage('发生错误' + E.Message);
        exit;
      end;
    end;
  finally
    停止菊花;
  end;
end;
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wjbox (寒夜) ▲▲▲▲▲ -
普通会员
2018/8/27 16:02:27
8楼:  遇到和楼主同样的问题,准备放弃  FDQuery  + FDSchemaAdapter + FDMemTable了,开始我也是看到内存表TFDMemTable用来替换TClientDataSet才尝试用TFDMemTable,用了之后很失望,而且没有TDataSetProvider的BeforeUpdateRecord事件对更新数据的灵活自定义处理,极不方便,或许是我研究不深?
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行39.0625毫秒 RSS