【问题标题】:C# & SQL Server : ExecuteNonQuery returning -1, when UPDATE works?C# & SQL Server:当 UPDATE 工作时,ExecuteNonQuery 返回 -1?
【发布时间】:2018-09-15 17:03:30
【问题描述】:

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

我正在使用 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。

我的小组编写的大多数查询/脚本都有 GO、SET ANSI_NULLS ON 和 SET QUOTED_IDENTIFIER ON 几乎是标准的,所以它无处不在(另一天的另一个问题 - 我知道在这种情况下它是过度/无关的) .这会以某种方式影响我的行数吗?如果是这样,您能否为解决方法或获得此结果的另一条路线提供一些方向?

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

【问题讨论】:

  • 你在使用实体框架吗?
  • Is this affecting my row count somehow? 你已经证明是的,并且你有解决方案。我不知道为什么会有所不同,但是您说过额外的语句是excessive/irrelevant in this case。
  • GO is not (SQL)语句 - 它只是 SQL Server Management Studio 使用的 delimiter (这就是为什么使用“正常” SQL 不起作用 - 因为 GO 真的不是 SQL 语句......)
  • @marc_s 这就是为什么 OP 使用 可以 处理 GO 的 SMO。
  • @DanWilson 我已将此查询设置为测试。所以在我的情况下,这些语句是无用的,但我正在尝试创建一个可以运行它们的小程序,因为我知道事实上这些语句需要用于我的团队构建的更大查询,所以这就是我尝试的原因运行这个来解决问题。

标签: c# sql sql-server smo executenonquery


【解决方案1】:

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

【讨论】:

  • 这清除了一些东西。谢谢你的澄清。让我提出这个问题——假设没有人将输出子句添加到更新语句的末尾。我可以以编程方式将其添加到末尾吗?如果是这样,这会有问题吗?询问是因为目前没有人使用输出子句编写查询,并且很难将其作为我们所有团队的标准。
  • 不,你不能。它必须嵌入到语句中的正确位置,并改变语义。我宁愿自己探索将文本分成批次(即寻找GOs),并确保在每次调用中只执行一个批次。然后你就可以决定每个人的“回报”意味着什么。
  • 我不明白为什么您的团队以这种方式编写查询,然后期望您从 C# 运行它们。如果他们想从代码中运行这些查询,那么他们应该修复他们编写查询的方式。
  • 仅供参考,很久以前我写了一个库来处理'plain' C# 中的GO 和其他SQLCMD 命令,请参阅github.com/rusanu/com.rusanu.dbutil。
  • @RemusRusanu 太棒了。这就是我要走的方向。谢谢!
猜你喜欢
  • 2011-12-28
  • 2011-01-13
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
相关资源
最近更新 更多