使用 INSERT...OUTPUT.inserted 时,SqlDataReader.RecordsAffected 错误地返回 -1

Nic*_*mas 4 c# ado.net sql-server-2008

我们依靠SqlDataReader.RecordsAffected计算存储过程修改的行数。

MSDN 对其定义如下:

更改、插入或删除的行数;如果没有行受到影响或者语句失败,则为 0;SELECT 语句为 -1...该属性的值是累积的。例如,如果以批处理方式插入两条记录,则RecordsAffected 的值为2。

看来 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'
);
Run Code Online (Sandbox Code Playgroud)

这是 ADO.NET 的行为是有意为之还是错误造成的?

作为记录,我们计划更改代码以使用显式捕获修改行的计数@@ROWCOUNT并将它们作为OUTPUT存储过程中的参数返回。

Nic*_*mas 5

嗯,密切关注文档肯定会有所帮助。

再次,来自 MSDN

在读取所有行并关闭 SqlDataReader 之前,不会设置 RecordsAffected属性

这有点谎言。

RecordsAffected 在关闭之前设置的SqlDataReader,但并非始终如此。我们在关闭对象之前查询它,并且一直工作得很好——直到我们开始OUTPUT inserted在 T-SQL 中使用。

RecordsAffected关闭后查询SqlDataReader会产生正确的修改行计数,无论是否带有OUTPUT子句。