1

我得到了这个例外:

触发器返回了一个结果集和/或在另一个未完成的结果集处于活动状态时以 SET NOCOUNT OFF 运行

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

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

假设我的 SQL Server DB 中有一个名为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)); 

其中TableAdapteradpt包含我的sql更新命令查询,它在 WCF 服务中实现,由 Web 服务使用,应用程序使用此 Web 服务。

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

4

1 回答 1

0

您能否尝试将 SET NOCOUNT OFF 放在触发器末尾,看看它是否解决了您的问题。另请查看以下 http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/5ee185e6-1980-4209-87f6-abeb9c5933fa/

于 2012-09-26T19:52:13.473 回答