c# - ExecuteNonQuery() 并设置 NOCOUNT ON

标签 c# sql-server ado.net

我使用 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/

相关文章:

javascript - 为 Outlook 2016 创建任务 Pane Office 加载项

c# - UNITY C# - 如何获取标有自定义属性(字段)的类实例的所有字段?

sql - 将 "Arnold Schwarzenegger"和 "Hasta la vista baby"插入到这两个空 SQL 表中,我的 SQL 语句是什么?

c# - SqlDataReader 读取方法

c# - 您在参数声明中使用的 varchar(MAX) 大小是多少?

c# - 为什么 var 在 "foreach (var row in table.Rows)"中评估为 System.Object ?

c# - 清除 WebBrowser 控件浏览历史

c# - LINQ 查询数据表以检查记录是否存在

c# - 自动生成不是 Entity Framework 中主键的 GUID 列

sql 选择计数 > 1 的记录,其中至少一条记录具有值