我有一个DataSnap Server
和两个TFDQuery's
通过TFDConnection
到MySQL
数据库。这个查询是在master/detail relationship
通过TDataSource
(嵌套的数据集)。该数据通过一个TDataSetProvider
导出。
在客户端,我有一个TDataModule
,一个TSQLConnection
,一个TDSProviderConnection
和两个TClientDataSet's
,一个用于Master
,另一个用于Neested Detail
通过DataSetField
属性。
当我测试我的客户端一切正常。
问题是当two clients
在相同的详细记录上工作simultaneously
时,我在一个客户端中写入一个细节的数据不会从我的第二个客户端看到,反之亦然。
假设我们有这样一个场景,一个简单的账单/项目关系:Bill1, Item1, OriginalData
如果我读取Bill1在两个客户端,两者读取相同的数据。如果我修改OriginalData到ModifiedData在我的第一个客户端,并执行ApplyUpdates
,它工作得很好,但然后我刷新相同的Bill1在我的第二个客户端,仍然读取不变的OriginalData
如果我把数据写进MasterTable
一切都很好,用我的DetailTable
购买,它似乎从一些缓存或其他东西中获得数据。我通过BDE
组件和Paradox
数据库复制所有内容,没有问题,但我们需要使用FireDac
和MySQL
那么,问题是……为什么通过FireDac
和MySql
使用DataSnap
调用refresh后,在第一个客户端中写入详细记录的数据在第二个客户端中看不到?
我正在使用Delphi Xe5 update 2.
注意:Master/Detail
是一个parametrized Query
,所以一次只有一个Bill是活动的。
再次为我的蹩脚英语道歉
通过设置服务器端TFDConnection
的 FetchOptions.DetailOptimize=FALSE
解决
当DetailOptimize为true (FireDac的默认值)时,FireDac仅在当前详细数据集关键字段值与主数据集关键字段值不同时刷新详细数据集。
更多信息请阅读FireDAC.Stan.Option.TFDFetchOptions.DetailOptimize