A触发器返回结果集和/或使用SET NOCOUNT OFF运行的含义是什么

时间:2012-09-26 19:06:30

标签: c# visual-studio-2010 sql-server-2008

我得到了这个例外:

  

触发器返回结果集和/或以SET NOCOUNT OFF运行,而另一个未完成的结果集已激活

我想知道它的含义是什么,有一个例子以及如何避免它(没有SET NOCOUNT ON - 因为我需要知道受影响的行数。)

这里有更多关于我在做什么的解释?

我们假设我的SQL Server数据库中有一个名为 AccNodesBal 的表,我在该表上有3个触发器:

  • FOR UPDATE
  • INSERT
  • DELETE

我使用ADO.net作为数据层。如您所知,FOR UPDATEINSERTDELETE语句,返回值是受命令影响的行数。当插入或更新的表上存在触发器时,返回值包括受影响的行数

  • 插入或更新操作
  • 受触发器或触发器影响的行数。

对于所有其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。

在我的应用程序(代码)中,我使用ExcecuteNonQuery并获取int变量中受影响的行数,并验证它是 2 以确保触发器是被解雇了,一切都被记录了。

但是我收到了这个错误:

A trigger returned a resultset and/or was running with SET NOCOUNT OFF
while another outstanding result set was active.

搜索后我发现我必须在触发器中使用SET NOCOUNT ON关键字。不幸的是,这不适用于我的应用程序,因为触发器现在不会返回受影响行的任何值。有没有人知道另一种方法来获取受更新语句影响的行数并触发而不使用SET NOCOUNT ON

这是我的代码

int recCount = adpt.cmdMovementUpdate(
      amtType == EFG.Acc.AccNodeService.Contracts.Entities.AmountType.Debit ? 0 : Amount, 
      amtType == EFG.Acc.AccNodeService.Contracts.Entities.AmountType.Debit ? Amount : 0, 
      NodeID, PeriodID, Convert.ToInt16(CurrCode), Convert.ToByte(BalCurrType)); 

其中adpt TableAdapter 包含我的sql 更新命令查询,它在WCF服务中实现,该服务由Web服务使用,并且应用程序消耗这个网络服务。

搜索后我发现建议使用SET NOCOUNT ON,但这对我不起作用,因为我的WCF服务验证取决于受ExecuteNonQuery影响的行的结果。

1 个答案:

答案 0 :(得分:0)

您是否可以尝试在触发器结束时将SET NOCOUNT设置为OFF,看看它是否可以解决您的问题。另请参阅以下内容 http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/5ee185e6-1980-4209-87f6-abeb9c5933fa/