我正在使用ADO.net调用存储过程来执行对Sybase数据库的插入,我想包含单元测试以确保插入调用正常工作。
根据规范:
IDbCommand.ExecuteNonQuery()
返回:受影响的行数。
当每个存储过程插入一行时,我正在检查返回的值== 1。 但是,每个过程返回一个不同的值,范围从3到8.
那么,“受影响的行数”这个短语究竟是什么意思?
我应该断言,procs中的唯一语句是Set,Insert,Print和Return,唯一不会影响返回值的语句是Insert!
感谢。
答案 0 :(得分:1)
然后你的程序做某事,它会产生一些触发器和系统更新,这取决于你的内在逻辑。这个数字是受影响的行的总和。
答案 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。
您可以使用存储过程返回值或输出参数来获取所需的值。