C# 和 SQL Server : ExecuteNonQuery returning -1, 何时更新有效?

标签 c# sql sql-server smo executenonquery

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

我正在使用 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 分配给输出变量。

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

相关文章:

sql-server - 由于 SQL Server 版本不同,无法使用 .bak 文件恢复数据库

sql-server - 动态列名称和值到 Where 子句

c# - 无法在 .NET 项目中使用 PerUserRoaming 参数保存配置文件

c# - 从 ViewModel 更改 ListBox 的 SelectedItem

c# - OData IQueryable 是异步的吗?

sql - MS SQL Server - 如何将所有存储过程从我的机器导出到我 friend 的机器?

c# - Twitter Bootstrap 字形图标不会出现在 Release模式 404 中

mysql - 删除MYSQL表中的所有重复值

java - Hibernate 中 INT(11) 的 UNSIGNED 约束

用于删除具有系统生成名称的 PK 约束的 SQL Server 2008 脚本