这是我的测试模型,设有四个表,[]表是主键,()表是外键
部门表: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;
--------------------------------------------------
问题:
删除一个员工的一个女友时,学校表中该女友的所上学校记录也被删除;
删除一个员工时,该员工的部门也被删除,并且从表记录没有被删除。
部门表: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;
--------------------------------------------------
问题:
删除一个员工的一个女友时,学校表中该女友的所上学校记录也被删除;
删除一个员工时,该员工的部门也被删除,并且从表记录没有被删除。
解决方案 »
- 为什么AnsiContainsText('800002', '2')结果是False
- 关于MemoryStream的问题,在线等!
- 什么是.udl文件?
- Raize Componets 4.0已安装上,但如何能挂上帮助呢?尤其是拖入一个Rz控件按F1键能看到帮助呢?
- 快过年了,在山西工作的程序员或山西人在外地的程序员你们好吗?进来报个到,留下联系方式!
- ezftp控件
- █号外,号外██>>>p2p软件源码(NC代码),现在完全免费下载--感谢大家长期来的无私帮助,算是一点小小心意
- 菜鸟问题,为什么会产生这么奇怪的异常错误
- 文档
- 如何读写 *.bin文件?
- 永别了,BDE! 感慨,撒分!
- Delphi+Oracle9i求助!(在线等待!)
有两种方法
一、设置数据提供者的ResolveToDataSet为False,也就是不使用ADO组件来进行更新操作。
二、在合适的事件过程中进行如下处理:
ADODataSet1.properties['unique table'].value:='tblEmp';
即告诉ADO要更新的表名;
因为在数据集打开后才能进行原生对象的属性值设置,在C/S下可写在onAfterOpen事件中;
在ADO+DCOM下写在数据提供者的onBeforeUpdataRecord事件中是测试过可行的,但最合适在
哪一个事件过程中还不太清楚。
你找一下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表记录时,删除就正确了。
不行啊,在前台出错,如下:
你是不是要写select count(*) from deleted
没问题的,返回是1。错误依旧。
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
---------------------------