静候lich及各位高手!!!巢状"一对多"正常, 但"一对多对多",当clientdataset.ApplyUpdate

  • 主题发起人 主题发起人 goodbyebye
  • 开始时间 开始时间
G

goodbyebye

Unregistered / Unconfirmed
GUEST, unregistred user!
静候lich及各位高手!!!巢状&quot;一对多&quot;正常, 但&quot;一对多对多&quot;,当clientdataset.ApplyUpdate发生错误时,为何客户端OnReconcileError无法捕捉到? ( 积分: 100 )<br />巢状&quot;一对多对多&quot;,当clientdataset.ApplyUpdate发生错误时,为何客户端OnReconcileError无法捕捉到?
1.普通情况, 主从(&quot;一对多&quot;)不会出现此问题;
2.当使用主从从(&quot;一对多对多&quot;)时,客户端OnReconcile无法捕捉到, 但介面显示&quot;Access violation at ..in.'midas.dll'.&quot;;
中间层调试时onUpdateError能捕捉到.
环境:
1. sqlserver2000,delphi7
2. sqlserver:
tblMain :主键字段: mid
tblSub 主键字段: mid,sid
tblThrd 主键字段: mid,sid,rid
并建立关系.
3.delphi:
中间层,用adodataset(adsMain,adsSub,adsThrd)建立巢状关系,只将adsMain连到datasetprovider;
客户端(cdsMain,cdsSub,cdsThrd)自不必说.
4.测试:
cdsMain故意新增一个tblMain中主键重复的记录, post 正常, 但applyupdate将出现上述错误.
(注意原记录不要出现在cdsMain当前数据中, 否则post时即捕捉到. 比如设置adsMain开始时打开空记录. select top 0 * from tblmain)
拜托各位了!!!
 
巢状&quot;一对多对多&quot;,当clientdataset.ApplyUpdate发生错误时,为何客户端OnReconcileError无法捕捉到?
1.普通情况, 主从(&quot;一对多&quot;)不会出现此问题;
2.当使用主从从(&quot;一对多对多&quot;)时,客户端OnReconcile无法捕捉到, 但介面显示&quot;Access violation at ..in.'midas.dll'.&quot;;
中间层调试时onUpdateError能捕捉到.
环境:
1. sqlserver2000,delphi7
2. sqlserver:
tblMain :主键字段: mid
tblSub 主键字段: mid,sid
tblThrd 主键字段: mid,sid,rid
并建立关系.
3.delphi:
中间层,用adodataset(adsMain,adsSub,adsThrd)建立巢状关系,只将adsMain连到datasetprovider;
客户端(cdsMain,cdsSub,cdsThrd)自不必说.
4.测试:
cdsMain故意新增一个tblMain中主键重复的记录, post 正常, 但applyupdate将出现上述错误.
(注意原记录不要出现在cdsMain当前数据中, 否则post时即捕捉到. 比如设置adsMain开始时打开空记录. select top 0 * from tblmain)
拜托各位了!!!
 
跟踪一下,看看哪里的错误
 
dbclient.pas其中
function TCustomClientDataSet.Reconcile(const Results: OleVariant): Boolean;
...
begin
...
for I := 0 to FReconcileDataSet.FieldCount - 1do
begin
...
end;
Check(FDSBase.Reconcile_MD(FReconcileDataSet.FDSBase, FDeltaPacket,
VarToDataPacket(Results), Integer(Self), RCB));
/////////////到此句出现问题
finally
FReconcileDataSet.Free;
FReconcileDataSet := nil;
end;
Resync([]);
end;
Result := (ChangeCount = 0);
end;
 
lich及各位:
不必太多字段,用最简单的三个table试一下就可以发现错误.
反之中间层及客户端去掉adsThrd及cdsThrd,则又恢复正常
不知何故?
而且我在客端从表cdsSub及cdsThrd中并未输入数据,只是在主表cdsMain中新增一重键记录.
 
看來用三層的還忙多的
 
现在三层的程序法,往往是根据书上写的那些例子来写。我本人觉得那其实是误导初学三层的人!真正的三层、多层程序,是把绝大部分业务处理放在服务器端进行处理的,而不是摆上几个控件。看看我的待答问题吧。
 
三层的目的之一是瘦客户,和业务封装到应用服务器
Midas套件只是一种实现策略,可以大大降低开发难度
 
若真要用到所谓&quot;完美的三层&quot;理论,做一个完整的系统试试看, 一定够你受的 :)
做系统到现在已接近尾声,不敢称三层,其实最终用户也不管你用什么技术.
权限分配,业务实现,大都在中间层进行;
客户端也不太瘦,但能自动更新.
客户端界面美观而灵活,主要是操作灵活方便,功能齐全这点--敢说没见过几个.且运行速度很快(在internet上实施过),并不是一些纯理论做来的慢如牛般.服务器也不像&quot;完美瘦客户&quot;做的那样不堪重负.而且用到多种安全策略,安全性极高.
从lich处学到不少,十分感谢!
当然还存在不少问题,还要向各位高手请教!
 
Delphi的多层套件只是一个很基础的东西,
Delphi自己的很多东西都不敢恭维,
譬如那个ClientDataSet 据说是最完备的数据集,
可是数据一多,就慢的要死,
如果要显示很多数据,不慢才怪呢
如果要显示很多数据,
用二维动态字符串数组,和ListView的虚拟方式,速度反而会快的多
 
楼主提的问题抽象来说属于: Master/Detail/SubDetail,呵呵,在系统设计上已经比较复杂,呵呵,当然,个别业务需求会导致这种设计出现!换个角度来说,不管多少个表,最后还是单表Submit,也就是说,如果我们能拿到Delta数据包,然后解释Delta为Sql语句,无法就是Update/Insert/Modify,然后在同一事务里处理,那问题也就解决。当然,使用传统的Midas 结构比较困难!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
472
import
I
后退
顶部