这是我的测试模型,设有四个表,[]表是主键,()表是外键
部门表: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;
--------------------------------------------------
问题:
删除一个员工的一个女友时,学校表中该女友的所上学校记录也被删除;
删除一个员工时,该员工的部门也被删除,并且从表记录没有被删除。

解决方案 »

  1.   

    我也曾遇到这样的问题,问了很长时间都没有解决。我最后只好在中间层的数据中每个ADOQuery只对一个表操作,连接的过程在Client端增加lookup字段来完成。
      

  2.   

    我已经找到方法解决了
    有两种方法
    一、设置数据提供者的ResolveToDataSet为False,也就是不使用ADO组件来进行更新操作。
    二、在合适的事件过程中进行如下处理:
      ADODataSet1.properties['unique table'].value:='tblEmp';
    即告诉ADO要更新的表名;
      因为在数据集打开后才能进行原生对象的属性值设置,在C/S下可写在onAfterOpen事件中;
      在ADO+DCOM下写在数据提供者的onBeforeUpdataRecord事件中是测试过可行的,但最合适在
    哪一个事件过程中还不太清楚。
      

  3.   

    能不能介绍一下MSSQL的ADODataSet.Properties.items[???]的???中都有什么,分别表示什么意思。谢谢。
      

  4.   

    呵呵,stonegern:
    你找一下ADO的参考文档看一下,我第一次用啊,初学者一个!
    只是最近在测试ADO的主从表,问题很多啊。***************************
    * 测试最新结果:--<触发器删除从表记录的模式>   *
    ***************************在前面问题解决的情况下,又发现新问题。
    为kEmp表设了个触发器{
    CREATE TRIGGER kEmpMst_Del ON [dbo].[kEmp] 
    FOR DELETE 
    ASDelete kGF 
    From kGF, Deleted
    Where kGF.EmpNo = Deleted.EmpNo
    }在frmMainTest只放ADODATASETkEmp+DS1+DBGrid1,
    AdoDataSetkEmp.commandtext为{
    Select A.EmpNo,A.EmpName,A.DeptNo,A.Addr,A.tel
    From kEmp A  }一、出错时机://删除按钮
    begin
      AdoDataSetkEmp.delete;//无缓存更新时,则马上出错!!有缓存更新时则在缓存更新时出错
    end;
    //缓存更新
    begin
      AdoConnection1.BeginTrans ;
      try
        AdoDataSetkEmp.UpdateBatch; //前面执行了删除时,出错
        AdoConnection1.CommitTrans;
      except
        AdoConnection1.RollbackTrans;
        raise;
      end;
    end;二、出错信息:在后台查看,当AdoDataSetkEmp当前记录没有对应的kGF表记录时,错误信息为:
    -->""无法为更新行集定位:一些值可能已在最后读取后改变。""在后台查看,当AdoDataSetkEmp当前记录有多于一条对应的kGF表记录时,错误信息为:
    -->""键列信息不足或不正确。更新影响到过多的行。""三、成功情况:在后台查看,当AdoDataSetkEmp当前记录只有一条对应的kGF表记录时,删除就正确了。
      

  5.   

    我个人认为这是因为,在提交时Delphi记录修改的记录个数为1,而返回提交成功的数据不是1,造成的。你在触发器的最后执行一句:Select * from Deleted试试吧。
      

  6.   

    stonegem:
    不行啊,在前台出错,如下:
    你是不是要写select count(*) from deleted
    没问题的,返回是1。错误依旧。
      

  7.   

    不是select count(*) 是select *
      

  8.   

    select * 不行的在前台出错。
    btndelete.onclick
    begin
      ADSkEmp.Connection.BeginTrans;
      try
        ADSkEmp.Delete;//1,2
        ADSkEmp.Connection.CommitTrans;
      except
        ADSkEmp.Connection.RollbackTrans;//3
        raise;
      end;
    end;
    ---------------------------1
    Debugger Exception Notification
    ---------------------------
    Project Test.exe raised exception class EOleException with message 'SqlDumpExceptionHandler: 进程 56 发生了严重的异常 c0000005 EXCEPTION_ACCESS_VIOLATION。SQL Server 将终止该进程。'. Process stopped. Use Step or Run to continue.
    ---------------------------
    OK   Help   
    ---------------------------
    ---------------------------2
    Debugger Exception Notification
    ---------------------------
    Project Test.exe raised exception class EDatabaseError with message 'SqlDumpExceptionHandler: 进程 56 发生了严重的异常 c0000005 EXCEPTION_ACCESS_VIOLATION。SQL Server 将终止该进程。'. Process stopped. Use Step or Run to continue.
    ---------------------------
    OK   Help   
    ---------------------------
    ---------------------------3
    Debugger Exception Notification
    ---------------------------
    Project Test.exe raised exception class EOleException with message '[DBNETLIB][ConnectionWrite (send()).]一般性网络错误。请检查网络文档。'. Process stopped. Use Step or Run to continue.
    ---------------------------
    OK   Help   
    ---------------------------
      

  9.   

    使用select不行,就用一下update吧。
      

  10.   

    stonegem:你不会吧! 你在信口开河啊?