SqlDataReader.RecordsActed неправильно возвращает -1 при использовании INSERT ... OUTPUT.inserted - PullRequest
3 голосов
/ 05 октября 2011

Мы полагаемся на SqlDataReader.RecordsAffected для подсчета количества строк, измененных хранимой процедурой.

MSDN определяет свое определение как:

Количество строк, измененных, вставленных или удаленных;0, если строки не были затронуты или инструкция не выполнена;и -1 для операторов SELECT ... Значение этого свойства является кумулятивным.Например, если две записи вставляются в пакетном режиме, значение RecordsActed будет равно двум.

Похоже, что ADO.NET неправильно интерпретирует любую инструкцию, используя OUTPUT предложение как оператор SELECT и возвращает -1 для RecordsAffected вместо действительного количества измененных строк.

Например:

CREATE TABLE dbo.example (
      a INT
    , b VARCHAR(10)
    , c DATETIME2(3)    DEFAULT(SYSUTCDATETIME())
);

INSERT INTO dbo.example (
     a
   , b
)
OUTPUT inserted.c -- Comment out this line and RecordsAffected goes from -1 to 1.
VALUES (
     1
   , 'blah'
);

Это поведение ADO.NET по замыслу или по ошибке?

Для записи мы планируем изменить наш код для явного сбора данныхмодифицированных строк с использованием @@ROWCOUNT и возвращают их как OUTPUT параметров в наших хранимых процедурах.

1 Ответ

4 голосов
/ 06 октября 2011

Ну, это, безусловно, помогает обратить пристальное внимание на документацию.

Опять же, из MSDN :

Свойство RecordsActed не устанавливается, пока всестроки читаются, и вы закрываете SqlDataReader .

Это в некотором смысле ложь.

RecordsAffected установлен перед вамизакрыть SqlDataReader, но не все время.Мы запрашивали его перед закрытием объекта, и это всегда работало нормально - пока мы не начали использовать OUTPUT inserted в нашем T-SQL.

Запрос RecordsAffected после закрытия вашего SqlDataReader дает правильный измененный счетчик строк, с предложением OUTPUT или без него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...