gpt4 book ai didi

c# - ExecuteNonQuery() 和 SET NOCOUNT ON

转载 作者:行者123 更新时间:2023-11-30 21:59:00 26 4
gpt4 key购买 nike

我使用 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 带来由“插入 [Workflows] …”运算符插入的行数。

并且仅由此运算符 INSERT。该 proc 在此之前包含一个 INSERT;但是客户端需要 numberOfAffectedRows 来填充由“插入 [Workflows]…”插入的行数。

错误如下: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 值,或者将它传回输出参数。看起来这样做可以让您永不过时,以防稍后添加的触发器导致您的计数发生变化,而不会对系统的功能产生实质性影响。

关于c# - ExecuteNonQuery() 和 SET NOCOUNT ON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29679780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com