触发器引起 VB datagrid错误! 请高手指导!!
我用VB+SQLSERVER2000编写了一个人员管理程序,为了保持数据一致性,我写了一个触发器:删除员工基本信息时,就在把他的职位信息和培训信息一起删掉,可是,写了触发器之后,在VB里我用datagrid显示了人员基本信息后想直接删除一个人员时,就会报错:“无法为更新定位行,一些值可能已在最后一次读取后已更改。”为什么会这样???
触发器是这样写的:
CREATE TRIGGER trgydel ON 员工基本表
after DELETE
AS
delete from 参赛表 where id in (select id from deleted)
delete from 培训表 where id in (select id from deleted)
delete from 投稿表 where id in (select id from deleted)
delete from 权限表 where id in (select id from deleted)
delete from 绩效考评表 where id in (select id from deleted)
delete from 职位基本表 where id in (select id from deleted)
问题点数:30、回复次数:17Top
1 楼liuyun2003(流云(老老实实做人,认认真真还贷))回复于 2003-09-01 14:42:58 得分 0
关注Top
2 楼txlicenhe(马可)回复于 2003-09-01 14:48:16 得分 0
看一下每个表都有建主键?Top
3 楼cat8rat(小小鸟)回复于 2003-09-01 14:53:35 得分 0
有主键,但是主键不同,比如说培训表的主键是(id、年、月),这个有影响吗?Top
4 楼sdhdy(大江东去...)回复于 2003-09-01 15:02:01 得分 0
员工基本信息的主键就是id吗?Top
5 楼cat8rat(小小鸟)回复于 2003-09-01 15:43:01 得分 0
是的,是idTop
6 楼enhydraboy(乱舞的浮尘)回复于 2003-09-01 15:47:37 得分 0
员工表有主键么?
Top
7 楼cat8rat(小小鸟)回复于 2003-09-01 16:30:17 得分 0
员工基本信息的主键就是idTop
8 楼zhongjy001(阿宇)回复于 2003-09-01 16:31:29 得分 0
知道了
是你在触发器中写的几个删除语句的顺序不对
导致了删除行的主键冲突
我也碰到过同样的问题Top
9 楼cat8rat(小小鸟)回复于 2003-09-01 17:24:59 得分 0
那怎么改呢?Top
10 楼zhongjy001(阿宇)回复于 2003-09-01 17:40:48 得分 0
你在以下几个要出发删除的表中,检查一下 删除前面的记录是否对后面的记录有影响
delete from 参赛表 where id in (select id from deleted)
delete from 培训表 where id in (select id from deleted)
delete from 投稿表 where id in (select id from deleted)
delete from 权限表 where id in (select id from deleted)
delete from 职位基本表 where id in (select id from deleted)
比如:培训表 中的记录删除后 会对 绩效考评表 的记录产生影响
如果有的话,你可以把delete from 绩效考评表 where id in (select id from deleted)
写到 培训表 的触发器中
不过可能性大点的是你在 员工基本表 中删除了记录后 影响了其它的关系
建议你先把触发器改为下面的试试:(把删除 员工基本表 中的记录放在最后)
CREATE TRIGGER trgydel ON 员工基本表
Instead Of DELETE
AS
delete from 参赛表 where id in (select id from deleted)
delete from 培训表 where id in (select id from deleted)
delete from 投稿表 where id in (select id from deleted)
delete from 权限表 where id in (select id from deleted)
delete from 绩效考评表 where id in (select id from deleted)
delete from 职位基本表 where id in (select id from deleted)
delete from 员工基本表 where --你删除员工的条件Top
11 楼cat8rat(小小鸟)回复于 2003-09-01 21:08:17 得分 0
很头痛,不光是删除有问题,就算是修改也有问题!而且计算也有问题,我觉得还不是楼上说的,你看看下个例子:
绩效考评表(id、年、月、月绩效分、年平均绩效)
我写了触发器,插入月绩效分时,自动按该月及以前11个月 的月绩效分,算出年平均绩效,
,修改月绩效分时,就自动修改该月以后各月的年平均绩效
也会出现那个错误,在vb中datagrid修改或添加数据时会提示“无法为更新定位行,一些值可能已在最后一次读取后已更改。”Top
12 楼Yang_(扬帆破浪)回复于 2003-09-01 22:44:27 得分 0
Try:
CREATE TRIGGER trgydel ON 员工基本表
after DELETE
AS
set nocount on
delete from 参赛表 where id in (select id from deleted)
delete from 培训表 where id in (select id from deleted)
delete from 投稿表 where id in (select id from deleted)
delete from 权限表 where id in (select id from deleted)
delete from 绩效考评表 where id in (select id from deleted)
delete from 职位基本表 where id in (select id from deleted)
Top
13 楼w_rose(w_rose)回复于 2003-09-01 23:35:40 得分 10
极大可能是客户端软件问题。这些软件使用了服务器端光标、并且保持与服务器的连接。
查询分析器也会出现同样问题。
暂时断开这些客户端软件对数据库的连接!待后台处理完后,重新刷新客户端的连接。Top
14 楼w_rose(w_rose)回复于 2003-09-01 23:39:45 得分 5
最好,使用ADO.net。
如果使用ADO,使用客户端光标,并且使用静态数据集“批更新”方式。
DataGrid我没用过。想必应该注意控制它的datasource对象,要让他仅仅“瞬间”访问服务器,然后立即断开与服务器的连接,不要总是保持与服务器的连接。Top
15 楼skyyiyang(伊扬)回复于 2003-09-02 08:27:01 得分 0
CREATE TRIGGER trgydel ON 员工基本表
after DELETE
AS
set nocount on
因為你所有的表都是“员工基本表“為基准,
所以要在這個事件之後才去刪除他。
就在要用After DELETE
Top
16 楼junny1017(好好学习,天天上网)回复于 2003-09-10 20:53:04 得分 5
你可以尝试着修改一下触发器,在UPDATE触发器时,把判断条件修改一下,避免一些没有必要的触发(比如,修改前后的值相同时,或没有行集受影响时,不要触发TRIGGER)另:以前用Delphe也有遇到过这么种问题,当时是在触发器使用游标的方法,也可以解决,但不推荐使用!Top
17 楼leimin(黄山光明顶)回复于 2003-09-10 23:08:33 得分 10
在VB调用DELETE操作后,重新REFRESH一次记录集。
不过建议不要用TRIGGR来实现,用STORTED PROCEDURE来实现会比较好。
delete from 参赛表 where id in (select id from deleted)
--------------^^^效率太低!!Top



