如何获取ExecuteNonQuery影响的行数并忽略触发器的行数?

8

我正在使用ExecuteNonQuery来运行一个插入过程,它返回2,但实际上我只插入了1条记录。由于触发器的原因,我得到了1个额外的结果。有没有办法只获取实际受影响的行数?我不想获取由触发器影响的行数。


1
可能是[ExecuteNonQuery() 返回意外的受影响行数 C#]的重复问题(http://stackoverflow.com/questions/15702131/executenonquery-returns-unexpected-number-of-rows-affected-c-sharp)。 - Dimitris Batsougiannis
3
你应该意识到你抱怨的是 ExecuteNonQuery 方法返回正确的数字,对吧? - Zohar Peled
ExecuteNonQuery返回受影响的行数,而不是插入的行数。 - Stoyan Petkov
请尝试将结果除以2 :) - Helio
2个回答

9
如果你还没有这样做,禁用触发器中的行计数功能:
SET NOCOUNT ON   

例如:

CREATE TRIGGER [dbo].[triggerName] ON [dbo].[TableName]
AFTER INSERT
AS
SET NOCOUNT ON;
......

MSDN


Tim,我想澄清一件事,“SET NOCOUNT ON”不会返回任何计数,对吗? - wiretext
1
如果触发器有SET NOCOUNT ON,则其受影响的行不会被计数。但是,如果您插入了三行,则ExecuteNoQuery仍然会返回3。 - Tim Schmelter
我正在创建自己的查询构建器。它可以运行任何类型的查询,在我的数据库中有成千上万的表和许多触发器。那么,它需要更改所有触发器以忽略计数吗? - Girish Gupta
1
@girishgupta211:那将是一个不错的方法。建议在触发器中设置SET NOCOUNT ON,这也会提高性能(正如Reza所提到的)。否则,无法忽略触发器的受影响行数。当然,您可以将查询更改为类似于此的形式:insert into dbo.TableName Values('B'); select @@ROWCOUNT";并使用(int)ExecuteScalar。但是,这可能是不正确的,因为它只返回最后一个语句的行数。这将忽略触发器。 - Tim Schmelter
谢谢Tim Schmelter。让我试试这个方法。 - Girish Gupta

1
请参考下面提到的图片。

enter image description here

然而,此函数的MSDN文章指出:对于UPDATE、INSERT和DELETE语句,返回值是命令所影响的行数。对于其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。
请参见... 输入链接描述

这个答案如何帮助避免触发器影响的行不被计算? - Tim Schmelter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接