首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

这是D7里的bug?安插带触发器的表出错

2013-03-21 
这是D7里的bug?插入带触发器的表出错!本帖最后由 drsheldoncooper 于 2013-03-17 00:59:02 编辑D7+MSSQL20

这是D7里的bug?插入带触发器的表出错!
本帖最后由 drsheldoncooper 于 2013-03-17 00:59:02 编辑 D7+MSSQL2000
有2张表ab,a里有触发器,当插入数据到a时,复制现在表a(不是inserted)的某个字段值到b


---------建表---------------
if exists(select * from sysobjects where name='a') drop table a
go
create table a 
(
 a_a char(10) primary key,
 a_b int
)
go
if exists(select * from sysobjects where name='b') drop table b
go
create table b (b_a int)
go
-------------触发器--------------
create trigger a_insert on a
for insert
as
  insert into b select a_b from a
go
------------用查询分析器进行插入----------------
begin tran
insert into a values('001',1)
insert into a values('002',2)
insert into a values('003',3)
commit tran

select * from a
select * from b


运行结果:
a_a             a_b
001       1
002       2
003       3

b_a
1
1
2
1
2
3

目前一切正常,但用D7批量插入3条记录却出现错误

delete from a
delete from b


//adoquery1打开表a
  adoquery1.AppendRecord(['001',1]);
  adoquery1.AppendRecord(['002',2]);
  adoquery1.AppendRecord(['003',3]);
  adoconnection1.BeginTrans;
  try
    adoquery1.UpdateBatch;
    adoconnection1.CommitTrans;
  except
    on e: exception do
    begin
      showmessage(e.Message);
      adoconnection1.RollbackTrans;
    end;
  end;


错误信息:键列信息不足或不正确。更新影响到多行。

如果认为是哪个表缺少主键,那下面这段只插入2行记录却运行正常

delete from a
delete from b


//adoquery1打开表a
  adoquery1.AppendRecord(['001',1]);
  adoquery1.AppendRecord(['002',2]);
  adoconnection1.BeginTrans;
  try
    adoquery1.UpdateBatch;
    adoconnection1.CommitTrans;
  except
    on e: exception do
    begin
      showmessage(e.Message);
      adoconnection1.RollbackTrans;
    end;
  end;

运行结果:
a_a          a_b
001       1
002       2

b_a
1
1
2

有大神知道原因吗,或者碰过类似的问题?是怎么解决的?谢过。
[解决办法]
顶一下看有遇到同类问题的筒子不

sql2000的触发器本身有bug, adoquery的post也有一些不可控的情况
LZ直接搜索该类问题看有解答没





[解决办法]
插入三条记录时,跟踪以如下内容
exec sp_executesql N'INSERT INTO "test".."a" ("a_a","a_b") VALUES (@P1,@P2); INSERT INTO "test".."a" ("a_a","a_b") VALUES (@P3,@P4); INSERT INTO "test".."a" ("a_a","a_b") VALUES (@P5,@P6); INSERT INTO  


"test".."a" ("a_a","a_b") VALUES (@P7,@P8); INSERT INTO "test".."a" ("a_a","a_b") VALUES (@P9,@P10)',N'@P1 varchar(10),@P2 int,@P3 varchar(10),@P4 int,@P5 varchar(10),@P6 int,@P7 varchar(10),@P8 int,@P9 
varchar(10),@P10 int','003       ',3,'002       ',2,'001       ',1,'002       ',2,'003       ',3



插入两条记录时,跟踪以下内容
exec sp_executesql N'INSERT INTO "test".."a" ("a_a","a_b") VALUES (@P1,@P2); INSERT INTO "test".."a" ("a_a","a_b") VALUES (@P3,@P4)',N'@P1 varchar(10),@P2 int,@P3 varchar(10),@P4 int','001       
',1,'002       ',2


有可能是TADOQuery的BUG哦。水平不高,查不出原因来。供参考。
[解决办法]
运行了一下,xe2+sql2008也有这种情况

热点排行