从'IDbCommand.ExecuteNonQuery'返回的值代表什么?

时间:2011-06-09 05:52:33

标签: c# stored-procedures ado.net sybase

我正在使用ADO.net调用存储过程来执行对Sybase数据库的插入,我想包含单元测试以确保插入调用正常工作。

根据规范:

IDbCommand.ExecuteNonQuery()
  

返回:受影响的行数。

当每个存储过程插入一行时,我正在检查返回的值== 1。 但是,每个过程返回一个不同的值,范围从3到8.

那么,“受影响的行数”这个短语究竟是什么意思?

我应该断言,procs中的唯一语句是Set,Insert,Print和Return,唯一不会影响返回值的语句是Insert!

感谢。

4 个答案:

答案 0 :(得分:1)

然后你的程序做某事,它会产生一些触发器和系统更新,这取决于你的内在逻辑。这个数字是受影响的行的总和。

更多信息: http://www.sqlhacks.com/Retrieve/Row_Count

答案 1 :(得分:0)

如果它具有一些依赖逻辑,只要在某些条件下添加超过1行的情况下验证你的sql例程逻辑。

答案 2 :(得分:0)

在不了解Sybase提供程序的情况下,可能的答案是ExecuteNonQuery返回SQL语句返回的“受影响的行数”消息的累积和。在SQL Server中,@@ROWCOUNT返回受最后一个语句影响的行数。

我在ExecuteNonQuery返回值的SqlCommand.cs源代码中发现了这条评论,但实际上没有验证它:

// sql reader will pull this value out for each NextResult call.  It is not cumulative
// _rowsAffected is cumulative for ExecuteNonQuery across all rpc batches
internal int _rowsAffected = -1; // rows affected by the command

在SQL Server中,您可以在存储过程中使用SET NOCOUNT来控制返回的计数消息数。如果没有返回消息,则ExecuteNonQuery通过在开头设置SET NOCOUNT ON返回-1。

SET和RETURN不会向计数消息所在的同一输出流发送消息,但PRINT会发送消息。打印的字符串不应该影响ExecuteNonQuery整数返回值,但我无法真正告诉。

关键是最好使用T-SQL输出参数来计算有趣的行,而不是依赖于ExecuteNonQuery返回值。输出参数的替代方法是使用SELECT结果集和ExecuteScalar

另请参阅

  

Overriding rows affected in SQL Server using ExecuteNonQuery?

答案 3 :(得分:0)

根据MSDN,'ExecuteNonQuery'的返回值与存储过程执行无关。

  

对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。对于所有其他类型的语句,返回值为-1。

您可以使用存储过程返回值或输出参数来获取所需的值。