关于ADO和触发器的问题 (50分)

  • 主题发起人 主题发起人 doggo
  • 开始时间 开始时间
D

doggo

Unregistered / Unconfirmed
GUEST, unregistred user!
问题的环境为三层结构,中间层为
ActiveX Library + Transactional Object(Requires a transaction),
通过DCOM连接,访问数据库的接口为ADO 2.5,后台数据库为sql server 7.0。
此问题仅在ADO采用原生驱动程序(Microsoft OLE DB Provider for SQL Server)
时有问题,换用Microsoft OLE DB Provider for ODBC Drivers后一切正常。
数据库中有A、B、C三个表,A和B、A和C为主从表的关系,A表中有一个trigger,
当往A表中每插入一条记录时通过trigger会从B、C两个表中选出与A表中key=0相对应的
记录,并把和A表连接键值该为新记录的key后插入B、C表本身。假如A表中插入的记录的
key值为newkey,sql语句如下:
insert into B
select newkey,OtherColumn from B
where B.A_FK = 0

insert into C
select newkey,OtherColumn from C
where C.A_FK = 0
在客户端插入新数据并通过ApplyUpdates(0)更新时报错,出错信息为“键列信息不足,
操作影响到多行”。在进行操作时只有一个用户在进行操作,经过多次尝试后发现只要在
trigger中的第一个insert语句插入的记录只有一条时就一切正常,只要第一个insert语句
插入多条记录就报错。迫不得已ADO的驱动程序采用
Microsoft OLE DB Provider for ODBC Drivers后一切正常。
又经过试验发现在两层的C/S结构中也存在同样的问题,不知道是什么原因,
应该如何解决?
 
估计是触发器的问题,
将触发器整个贴出来看看。
 
下面是触发器的内容,请各位帮忙看看:
CREATE trigger AINewUser on TSUser for insert as
begin
insert into TSAppPermi(FUserID,FModuleID,FFlag,FFlagEx)
select inserted.FID, TSAppPermi.FModuleID, TSAppPermi.FFlag, TSAppPermi.FFlagEx
from TSAppPermi, inserted
where inserted.FType = 0 and
TSAppPermi.FUserID = 0

insert into TSModuleParm(FUserID,FModuleID,FName,FType,FValue,FValueEx,FDesc)
select inserted.FID, TSModuleParm.FModuleID, TSModuleParm.FName, TSModuleParm.FType,
TSModuleParm.FValue, TSModuleParm.FValueEx, TSModuleParm.FDesc
from TSModuleParm, inserted
where inserted.FType = 0 and
TSModuleParm.FUserID = 0

insert into TSAppPermi(FUserID,FModuleID,FFlag,FFlagEx)
select inserted.FID, TSAppPermi.FModuleID, TSAppPermi.FFlag, TSAppPermi.FFlagEx
from TSAppPermi, inserted
where inserted.FType = 1 and
TSAppPermi.FUserID = 20
return
end

 
先试一下关闭回响:
在触发器首行加上SET NOCOUNT ON
在return前面加上SET NOCOUNT OFF
 
多谢zhanggeye的回答,不过我已经试过关闭回响了,报一样的错!
 
》此问题仅在ADO采用原生驱动程序(Microsoft OLE DB Provider for SQL Server)
》时有问题,换用Microsoft OLE DB Provider for ODBC Drivers后一切正常。
从问题的描述我猜到关闭回响就应可以解决问题。
我专门做了个测试,事实证明我的想法是正确的。
你也可以做一下这个测试:
表ta:
字段:id,type,ta
表tb:
字段:id,type,tb

先在tb中录入两条type=0的记录。
为ta表建触发器:
CREATE TRIGGER [TRIGGERa] ON [ta]
FOR INSERT
AS
insert into tb (type ,tb)
select inserted.type,tb.tb
from inserted,tb
where inserted.Type = 0 and
tb.type = 0

用delphi5+ado做个ta的录入程序,输入记录时出现:
“键列信息不足,操作影响到多行”,和你的程序一样的错误!!!!

将触发器改为:
CREATE TRIGGER [TRIGGER NAME] ON [ta]
FOR INSERT
AS
SET NOCOUNT ON
insert into tb (type ,tb)
select inserted.type,tb.tb
from inserted,tb
where inserted.Type = 0 and
tb.type = 0
SET NOCOUNT Off

就再也没有出错了。
输入数据完全正常。
之所以你的程序还有相同的错误,
可能是相关表或相关触发器没有关回响的原因。



 
多谢zhanggeye!问题解决了,的确是回响的问题,有一个相关表的回响我忘了关闭,
关闭后就一切正常了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部