我在MIDAS的远程数据模块中使用两个AdoQuery建立了一个M/D关系。客户端的cdsMaster与中间层qryMaster的接口dspMaster连接(dspMaster的ResolveToDataSet已置为True),能够获取到qryDetail,使用cdsDetail的DataSetField与qryDetail相连。
现在的问题就是我在客户端如何进行这种主从表的添加和修改更新操作,并能够保证数据的完整性。
还有就是,有人说在数据量大的情况下,这种方法不好,那么又该如何实现呢?我也看了以前的一些帖子,但是问题还是没有解决,希望大家多多指教!在此谢过了!

解决方案 »

  1.   

    调用cdsmaster.update()即可更新。
      

  2.   

    其实,这个问题非常简单,你是在中间层中,进行主从表关联的这种方式非常好更新,你只需要更新主表就行了,从表是以主表的一个字段的方式出现的,你就把它看成一个字段就行了.
    用ClientDataSet1.ApplyUpdates(0) 更新数据,保证成功,我多层结构我做的太多了呀
      

  3.   

    在补充一点,关于数据多的问题,你可以在客户端对主表动态赋SQL语句,加WHERE字句就可以了
      

  4.   

    我也认为这种更新应该不难,但是就是不行呀。
    我用cdsmaster.applyupdates(0),但是只有主表更新了,在更新从表时报告“Cannot perform this operation on a close dataset”,不知是什么原因???
      

  5.   

    lijx18, 您好。
     在“三层结构中,主从表更新问题”问题中,你说,
    在补充一点,关于数据多的问题,你可以在客户端对主表动态赋SQL语句,加WHERE字句就可以了。
     而我在主从表中必须select * from tablename (不加where,可以两表主从相连,通过matersource连)
     我想向您请教一下:
     但记录非常多时,为什么我加where条件后主从表却不能相连呢,比如ID=Master_ID,ID变化了,但 master_ID却始终为0
      不知如何解决??
      谢谢了
      

  6.   

    终于能够进行添加修改操作了,但是如果存储从表出现错误(如:约束条件不满足),从表无记录但主表能够保存,造成数据不完整,我该怎么解决呢???
    并且在进行删除操作时,提示不能删除有Detail的Master记录,我只能先进行Detail的删除再进行Master的删除,最后进行提交。这又是什么原因呢???谢谢大家多多指教!
      

  7.   

    为什么Detail表更新出错,主表的DataSetProvider捕获不到呢?
    我怎样才能进行数据的全部回滚呢?
      

  8.   

    --我也认为这种更新应该不难,但是就是不行呀。-
    --我用cdsmaster.applyupdates(0),但是只有主表更新了,在更新从表时报告“Cannot perform this operation on a close dataset”,不知是什么原因???解决方法:
    在远程数据模中,主表ADS的ONAFTEROPEN中OPEN从表的ADO。删除从表的记录:好像是DATASETPROVIDER设为级联删除。不过我在测试过程中对主表进行删除时并不能删除从表的任何记录。郁闷中....
    这是我的测试模型,设有四个表,[]表是主键,()表是外键
    部门表:kDept=[DeptNo],DeptName
    员工表:kEmp=[EmpNo],EmpName,(DeptNo),Addr,tel
    学校表: kSchool=[schoolNo],schoolName
    女友表: kGF=[EmpNo,GFNo],GFName,LikeColor,HomeTel,HomeAddr,(SchoolNo)
    ----------------------------------
    中间层远程数据模块内:
    主表QEmpGFMst.Sql={
    Select A.EmpNo,A.EmpName,A.DeptNo,A.Addr,A.tel
    ,B.DeptName 
    From kEmp A  
    Left Join kDept B on A.DeptNo=B.DeptNo'
    }
    从表QEmpGFDtl.SQL={
    Select A.EmpNo, A.GFNo,A.GFName,A.LikeColor,A.HomeTel,A.HomeAddr,A.SchoolNo
    ,B.SchoolName
    From kGF A
    Left Join kSchool B on A.SchoolNo=B.SchoolNo
    Where A.EmpNo=:EmpNo
    }
    ------------------------------------
    数据提供者
    DspEmpGF.ResolveToDataSet=True;
    DspEmpGF.Options=poCascadeDeletes;
    DspEmpGf.UpdateMode=upWhereKeyOnly
    ------------------------------------
    数据集QEmpGFMst与Dtl中主键字段的
    ProviderFlags.pfInUpdte=True,
    ProviderFlags.pfInWhere=True,
    ProviderFlags.pfInWhere=True;
    非主键真实字段
    ProviderFlags.pfInUpdte=True;
    从其他表关连来的字段如DeptName,SchoolName,ProviderFlags均为False;
    客户端ClientDataSet设置与中间层数据集一致,并且主表的数据集字段CdsMstQEmpGFDtl.ProviderFlags.pfInUpdte=True;
    --------------------------------------------------
    问题:
    删除一个员工的一个女友时,学校表中该女友的所上学校记录也被删除;
    删除一个员工时,该员工的部门也被删除,并且从表记录没有被删除。
      

  9.   

    我已经基本摸清ADO的脾气。
    ADO数据集组件能够处理多表更新操作,也就是针对JOIN语句中的所有表进行更新
    (包括insert,edit,delete)。数据提供组件的级联删除属性是针对后台数据库设置了主从表关联并且该RDBMS支持级联删除的,
    否则该属性设与不设都不会在删除主表时自动删除关联的从表记录;如果你不需要多表更新,也就是说你像我一样只想更新FROM 后边的表,并不想更新 JOIN 后面的表的话,请将数据提供组件的ResolveToDataSet设为False.至于删除主表记录时随之删除从表关联记录,我想触发器是一种好的选择。
      

  10.   

    '无法为更新行集定位:一些值可能已在最后读取后改变。'. Process stopped. Use Step or Run to continue.删除主表记录时还是有问题,表现为:
    因为删除主表时ADO不会自动删除从表,所以我在后台设了一个触发器删除从表记录。
    当删除主表记录时,如果从表有一条记录则不会出错,如果从表没有记录或有多于一条记录时出错,上面是信息。