C#& SQL Server:当UPDATE工作时,ExecuteNonQuery返回-1?

时间:2018-04-05 19:06:34

标签: 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' 

我正在捕捉受影响的行#34;由:

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

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

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

我的小组编写的大多数查询/脚本都有GOSET ANSI_NULLS ONSET QUOTED_IDENTIFIER ON几乎标准所以它到处都是(另一天的另一个问题 - 我很清楚它在这种情况下过度/不相关)。这会以某种方式影响我的行数吗?如果是这样,你能为解决方法提供一些方向,或者为获得这个结果提供另一条路线吗?

是的......我知道ExecuteNonQuery应该返回受影响的行数。我只需要知道为什么它没有返回我认为应该的东西(在这种情况下为1)。

1 个答案:

答案 0 :(得分:4)

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