【问题标题】:ExecuteNonQuery returns -1 even though the execution was successful即使执行成功,ExecuteNonQuery 也会返回 -1
【发布时间】:2009-04-28 09:29:22
【问题描述】:

我正在运行一个 asp.net 2.0 Web 应用程序。今天早上突然,ExecuteNonQuery 开始返回 -1,尽管 ExecuteNonQuery 正在运行的 SP 中的命令正在执行(我看到数据库中插入和更新了项目),并且没有抛出异常。

只有当我连接到我们的生产数据库时才会发生这种情况。当我连接到我们的开发数据库时,它们会返回正确的受影响行数。

另外,有趣的是,ExecuteDataSet 没有问题 - 它返回精美的 DataSet。

所以这似乎不是连接问题。但是,那还能是什么?

【问题讨论】:

  • 我记得是因为我的一个朋友花了一整夜的时间来追踪那个 bug :)

标签: asp.net sql


【解决方案1】:

你也可以查看程序看看里面有没有这行代码-

SET NOCOUNT ON

这将导致 ExecuteNonQuery 始终返回 -1。

【讨论】:

  • 问题确实是 NOCOUNT 开启了,但不是在 SP 级别,而是在 Database Server 级别。当我们的 DBA 运行以下命令时,它被意外设置了:declare @option int set @option = @@options | 64 exec sp_configure 'user options', @option RECONFIGURE 撤消它的方法是:在SQL Management Studio中,右键单击相关的数据库引擎,然后选择属性。然后从“选择页面”列表中选择“连接”。在那里,在“默认连接选项”下,取消选中“无计数”附近的复选框
【解决方案2】:

-1 表示“不影响行”。
SELECT 语句也将返回 -1。

检查 SP 对开发和实际环境的影响。

取自SqlCommand::ExecuteNonQuery Method

对于 UPDATE、INSERT 和 DELETE 语句,返回值是受命令影响的行数。当正在插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也是-1。

【讨论】:

  • ExecuteNonQuery - “返回值包括受两者影响的行数”是否返回受影响行数的总和?
【解决方案3】:

我在 NpgsqlDataAdapter 中遇到 almost same problem(尽管在 Postgresql 中),Update 方法总是返回 1。

也许您到开发数据库的连接字符串与您的生产数据库不同。或者,如果它们的连接字符串之间确实没有区别,那么您的生产数据库的服务包可能与您的开发数据库不同。

【讨论】:

    【解决方案4】:

    ExceuteNonQuery 根据 msdn 为所有类型的存储过程返回 -1

    只有在sattment的情况下才会返回更新的记录值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多