我使用 MS SQL Server 2008 R2 我有一个 C# 应用程序 – 它的客户端。 我遇到了以下错误(但仍然无法重现它。以下客户端代码使“受影响的行数”超出了应有的范围:
…
DbCommand cmd = db.GetStoredProcCommand("TheStoredProc");
int numberOfAffectedRows = db.ExecuteNonQuery(cmd);
…
数据库中的存储过程 TheStoredProc 如下所示:
PROCEDURE TheStoredProc
as
declare @Var1 int
**SET NOCOUNT ON;**
…
insert into [Workflows]
(
WorkflowInstanceID,
Status
)
select WorkflowInstanceID, 1
from #tmp
DROP TABLE #tmp
这是继承的代码;我不是它的作者。但从上下文中我看到 - 客户端期望 ExecuteNonQuery 带来由“插入 [工作流程] ...”操作符插入的行数。
并且仅通过此运算符 INSERT。该过程在此之前还包含一个 INSERT;但客户端需要 numberOfAffectedRows 填充仅由“插入 [工作流程]...”插入的行数。
该错误如下:numberOfAffectedRows 的值为 464。但是从数据库内容来看,我认为它应该是 419。并且该错误不可重现 - 目前我只在 Productions 服务器上看到过一次;并且仍然无法在我的测试服务器上重现它。在测试服务器上,numberOfAffectedRows 是正确的。
我有以下版本:错误的原因是 TheStoredProc 开头的“SET NOCOUNT ON”。 Here我也发现了同样的问题:
… I have heard few side effects of using "SET NOCOUNT ON" a. SQLCommand.ExecuteNonQuery function returning wrong number of rows if the stored procedure has SET NOCOUNT ON. …
我经常(在其他论坛上)遇到这样的提示:在这种情况下 ExecuteNonQuery 返回 (-1)。
你觉得怎么样——我说得对吗?
错误修正应如下:在“插入[工作流程]…”之前插入“SET NOCOUNT OFF”。在我的测试服务器上,这工作正常 - 但初始代码在测试服务器上也工作正常......
最佳答案
我认为 SET NOCOUNT ON 总是会返回 -1(在某些情况下可能不是这样,但是......)
ExecuteNonQuery 计算受插入/更新影响的行数,以及由于触发器而修改的任何行数。您在测试或生产数据库中受影响的表上是否有任何可能表现不同的触发器?
您是否有任何理由不想显式返回您感兴趣的行数?例如,更改在您感兴趣的插入后添加此内容:
select @rowcount = @@ROWCOUNT
然后返回该 @rowcount 值,或将其传递回输出参数。似乎这样做可以为您提供面向 future 的保障,以防以后添加触发器导致您的计数发生变化,而不会严重影响系统的功能。
关于c# - ExecuteNonQuery() 并设置 NOCOUNT ON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29679780/