我使用2008 R2,我有一个C#应用程序-它的客户端。我遇到了以下错误(但仍然无法复制)。以下客户端代码带来的“受影响的行数”比它应该看到的要多:
…
DbCommand cmd = db.GetStoredProcCommand("TheStoredProc");
int numberOfAffectedRows = db.ExecuteNonQuery(cmd);
…DB中存储的proc TheStoredProc如下所示:
PROCEDURE TheStoredProc
as
declare @Var1 int
**SET NOCOUNT ON;**
…
insert into [Workflows]
(
WorkflowInstanceID,
Status
)
select WorkflowInstanceID, 1
from #tmp
DROP TABLE #tmp这是继承的代码;我不是它的作者。但是从我看到的上下文-中,客户端希望ExecuteNonQuery将“插入到工作流…”中插入的行数带来。操作员.
只有这个操作符插入。proc在此之前还包含一个插入;但是客户端需要填充numberOfAffectedRows,其中只有由“INSERT…”插入的行数。。
错误如下: numberOfAffectedRows获得了值464。但从DB内容来看,应该是419。而且这个bug是不可复制的--直到我在Productions服务器上看到它一次的时候,它仍然不能在我的测试服务器上再现。在测试服务器上,numberOfAffectedRows是正确的。
我有以下版本:错误的原因是“SET NOCOUNT ON”inb -- TheStoredProc的开始。这里我发现了同样的问题:
…我听说过使用"SET NOCOUNT ON“的副作用。如果存储过程设置了NOCOUNT,则SQLCommand.ExecuteNonQuery函数返回错误的行数。…
更多的时候(在其他论坛上),我遇到ExecuteNonQuery在这种情况下返回(-1)的抱怨。
你觉得-我说得对吗?
修补程序应该如下:在“插入工作流…”之前插入“SET NOCOUNT OFF”。在我的测试服务器上,这个工作正常,但是初始代码在测试服务器…上也正常工作。。
发布于 2015-04-16 20:31:47
我认为将NOCOUNT设置为NOCOUNT总是会返回-1 (可能有些情况不是这样,但是.)
ExecuteNonQuery计算受insert/update影响的行数,但也计算因触发器而修改的任何行数。在测试或生产数据库中的受影响表上是否有任何可能行为不同的触发器?
有什么理由不想显式地返回您感兴趣的行数吗?例如,更改在您感兴趣的插入之后添加此内容:
select @rowcount = @@ROWCOUNT然后返回该@rowcount值,或者将其传回一个输出参数。似乎这样做是未来的证明,万一以后增加了一个触发器,导致你的计数发生变化,而不会对你的系统的功能造成实质性的影响。
https://stackoverflow.com/questions/29679780
复制相似问题