如果之前有人问过,请道歉。我搜索了一个小时,但没有找到我遇到的确切问题。
我正在使用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。
我的小组编写的大多数查询/脚本都有GO
,SET ANSI_NULLS ON
和SET QUOTED_IDENTIFIER ON
几乎标准所以它到处都是(另一天的另一个问题 - 我很清楚它在这种情况下过度/不相关)。这会以某种方式影响我的行数吗?如果是这样,你能为解决方法提供一些方向,或者为获得这个结果提供另一条路线吗?
是的......我知道ExecuteNonQuery
应该返回受影响的行数。我只需要知道为什么它没有返回我认为应该的东西(在这种情况下为1)。
答案 0 :(得分:4)
GO
是SQLCMD,OSQL和其他工具使用的批量分离器。由于SMO的ServerConnection.ExecuteNonQuery
碰巧识别出SQLCMD命令,它会为您处理批处理分隔符并执行您在文本中发出的每个批处理。 '返回'系列的值不是一个明确的命令,因为每个批次可能有自己的返回(更不用说每个批次可能包含多个语句)。所以我会接受这个'返回'有一粒盐的价值。如果要确认更新的行数,请在UPDATE中使用OUTPUT子句并使用结果集,或者将@@ROWCOUNT
分配给输出变量。