Что представляет собой значение, возвращаемое из IDbCommand.ExecuteNonQuery? - PullRequest
4 голосов
/ 09 июня 2011

Я использую ADO.net для вызова хранимых процедур для выполнения вставок в базу данных Sybase, и я хочу включить модульные тесты, чтобы убедиться, что вызовы вставки работают правильно.

В соответствии со спецификацией:

IDbCommand.ExecuteNonQuery()

Возвращает: Количество затронутых строк.

Поскольку каждая хранимая процедура вставляет одну строку, я проверяю, что возвращаемое значение == 1. Однако,каждая процедура возвращает свое значение в диапазоне от 3 до 8.

Итак, что именно означает фраза «Количество затронутых строк»?

Я должен отделить, что единственные операторы вПрокси - это Set, Insert, Print и Return, и единственное утверждение, которое, кажется, не влияет на возвращаемое значение, это Insert!

Спасибо.

Ответы [ 4 ]

1 голос
/ 09 июня 2011

Тогда ваша процедура что-то делает, могут возникнуть некоторые триггеры и системные обновления, в зависимости от вашей внутренней логики. И это число является суммой затронутых строк.

Дополнительная информация: http://www.sqlhacks.com/Retrieve/Row_Count

0 голосов
/ 12 июня 2011

Согласно MSDN возвращаемое значение ExecuteNonQuery не имеет отношения к выполнению хранимой процедуры.

Для операторов UPDATE, INSERT и DELETE возвращаемое значение являетсяколичество строк, затронутых командой.Для всех других типов операторов возвращаемое значение равно -1.

Вместо этого можно использовать возвращаемые значения хранимой процедуры или выходные параметры для получения желаемого значения.

0 голосов
/ 09 июня 2011

Без ведома поставщика Sybase вероятный ответ заключается в том, что ExecuteNonQuery возвращает совокупную сумму сообщений «Число затронутых строк», возвращаемых оператором SQL.В SQL Server @@ ROWCOUNT возвращает количество строк, затронутых последним оператором.

Я нашел этот комментарий в источнике SqlCommand.cs для возвращаемого значения ExecuteNonQuery, но не сделалфактически проверьте это:

// 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 возвращает -1, если сообщения не возвращаются, установив SET NOCOUNT ON в начале.

SET и RETURN не отправляют сообщения в один и тот же поток вывода, куда идут сообщения с подсчетом, но PRINT делает.Печатные строки не должны влиять на целочисленное возвращаемое значение ExecuteNonQuery, но я не могу точно сказать.

Дело в том, что лучше использовать выходные параметры T-SQL для вычисления интересных строк, чем полагаться на возврат ExecuteNonQueryзначение.Альтернативой выходным параметрам является использование набора результатов SELECT и ExecuteScalar

См. Также

Переопределение строк, затронутых в SQL Server с использованием ExecuteNonQuery?

0 голосов
/ 09 июня 2011

Просто проверьте вашу логику подпрограммы sql, если она имеет некоторую логику зависимости, на случай, если она добавляет более 1 строки при определенном условии.

...