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

我正在使用 SMO 对 SQL Server 运行一些查询,因为我读过这可以处理 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'

我正在捕获受以下因素影响的“行”:
int numberOfRows = db.ConnectionContext.ExecuteNonQuery(s.Query);

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

阅读其他一些帖子后,我开始认为问题可能出在此查询的前四行。我删除了 GO 语句,查询返回的值为 1 而不是 -1。

我的小组编写的大多数查询/脚本都有 GOSET ANSI_NULLS ONSET QUOTED_IDENTIFIER ON 几乎是标准的,所以它无处不在(另一天的另一个问题 - 我知道在这种情况下它是过度的/无关紧要的)。这是否会以某种方式影响我的行数?如果是这样,您能否为解决方法或获得此结果的其他途径提供一些指导?

是的...我知道 ExecuteNonQuery 应该返回受影响的行数。我只需要知道为什么它没有返回我认为应该返回的内容(在本例中为 1)。

最佳答案

GO 是 SQLCMD、OSQL 等工具使用的批处理分离器。由于 SMO 的 ServerConnection.ExecuteNonQuery 碰巧识别 SQLCMD 命令,它会为您处理批处理分隔符并执行您在文本中发出的每个批处理。系列的“返回”值不是一个明确的命令,因为每个批次可能都有自己的返回值(更不用说每个批次可能包含多个语句)。所以我会用一粒盐来取回这个“返回”值。如果要确认更新的行数,请在 UPDATE 中使用 OUTPUT 子句并获得结果集,或者将 @@ROWCOUNT 分配给输出变量。

关于UPDATE 工作时的 C# 和 SQL Server : ExecuteNonQuery returning -1,?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49679726/

10-09 02:49