各位大哥:
    先自我介绍下先,小弟小名J_John,乃一菌男,但最重要的是家住温州(一个IT荒漠,注意荒漠),所为一方水土一方人啊,所以天生注定了低水平低智商的小弟我!    好,先说正题!小弟自从入道以来,甚少使用触发器(除了学习)。近日在一项目中使用触发器,项目平台(Windows2000+SQL SERVER 2000),开发工具(BCB, DELPHI, VC, VB, VFP...),其实开发平台不重要,重要的是数据访问组件是(ADO+SQLSERVER OLE DB)。
    由于SQL SERVER OLE DB产生的SQL 更新语句都使用sp_executesql执行SQL语句(我花了一只鸡腿的代价问过盖茨:“为什么用这个哩?”,他抹抹嘴巴的油说:“这个啦,可以预处理SQL语句啦,效率啦!”),而sp_executesql有个坏习惯,它在处理SQL语句的时候,会将被处理SQL语句的引起的触发器或存储过存内部执行信息透露出来!就是@@ROWCOUNT。小弟一向理解奇差,不如举个例大家一起讨论吧。    例:有表t1, t2, t3,三个表都只有一个字段(f1 varchar(30) NOT NULL),而t1有一个插入触发器如下
    INSERT INTO t2(f1)
    SELECT f1
    FROM t3
而t3有两条或两条以上的记录!如此时在查询分析器中使用如下语句
    INSERT INTO t1(f1) VALUES('a');
则查询分析器消息为
    (所影响的行数为 1 行)
而如使用sp_executesql,即如下查询语句:
    EXEC sp_executesql 'INSERT INTO t1(f1) VALUES(''a'')';
则查询分析器消息为
   (所影响的行数为 2 行)   --就是这句,触发器的INSERT语句@@ROWCOUNT被显示
   (所影响的行数为 1 行)
而ADO产生的SQL语句恰恰是sp_executesql形式,如此一来,“(所影响的行数为 2 行)”这@@ROWCOUNT产生的2就足以让ADO弹出一个所谓“键值不够,无法定为行集,更新多行”之类的异常。    好啦,事情的前因后果都说完了,这就是现在我的苦恼,各位大哥有什么办法解决?