Мы полагаемся на 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
параметров в наших хранимых процедурах.