C# & SQL 服务器:ExecuteNonQuery 返回 -1,UPDATE 工作时?

C# & SQL Server : ExecuteNonQuery returning -1, when UPDATE works?

如果之前有人问过这个问题,我们深表歉意。我已经搜索了一个小时,但没有找到我遇到的确切问题。

我正在使用 SMO 运行 一些针对 SQL 服务器的查询,因为我读过它可以处理 GO 语句,而不是 System.Data.SqlClient

我正在运行宁此查询:

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO  

UPDATE Program
SET ENABLED = '1'
WHERE Program_ID = '64' AND Program_Name = 'DoesSomething' 

我正在通过以下方式捕获 "rows affected":

int numberOfRows = db.ConnectionContext.ExecuteNonQuery(s.Query);

我遇到的问题是这个 return 每次都是 -1 的值。我正在后台检查数据库,它每次都会更新值,当我在 SSMS 中手动 运行 查询时,我收到(1 行受影响)确认。

阅读其他一些帖子后,我认为问题可能出在该查询的前四行中。我删除了 GO 语句,并且查询 returned 的值为 1 而不是 -1。

我的小组写的大多数 queries/scripts 有 GOSET ANSI_NULLS ONSET QUOTED_IDENTIFIER ON 几乎是标准的,所以它无处不在(另一天的另一个问题 - 我是请注意,在这种情况下它是 excessive/irrelevant)。这会以某种方式影响我的行数吗?如果是这样,您能否提供一些解决方法的指导或可能获得此结果的其他途径?

是的...我知道 ExecuteNonQuery 应该 return 受影响的行数。我只需要知道为什么它不是 return 我认为应该的(在本例中为 1)。

GO是SQLCMD、OSQL等工具使用的批处理分隔符。由于 SMO 的 ServerConnection.ExecuteNonQuery 恰好识别 SQLCMD 命令,它会为您处理批处理分隔符并执行您在文本中发出的每个批处理。系列的 'return' 值不是一个明确的命令,因为每个批次可能有自己的 return (更不用说每个批次可能包含多个语句)。所以我会对 'return' 值持保留态度。如果要确认更新的行数,请在 UPDATE 中使用 OUTPUT 子句并生成结果集,或者将 @@ROWCOUNT 分配给输出变量。