SQL 服务器 TIMESTAMP 值 OUTPUT 参数和 ADO.NET

SQL Server TIMESTAMP values OUTPUT parameters and ADO.NET

考虑这个简单的 SP:

create proc Updater
   @id int,
   @name varchar(25),
   @rowversion timestamp
  as
  begin
    update FOO
    set name=@name
    where id = @id and rowversion = @rowversion;

    if @@rowcount > 0
          select @rowversion = rowversion
          from FOO where id = @id;
    end

如果其他人在客户端应用程序读入该行后编辑了该行,则此更新将(故意)失败,因为客户端应用程序使用的时间戳已过时。

ADO.NET 专家的问题:@rowversion 参数是否必须在 SP 中声明 OUTPUT 以便通过 dataAdapter 的 UpdateCommand return 编辑最新的时间戳?或者,如果 ADO.NET 方向设置为 ParameterDirection.InputOutput,IN return 的默认服务器端参数方向是否会是一个值?

请参阅 RowUpdating 事件的文档:

"If there are output parameters, they are placed in the DataRow."

这份 ADO.NET 文件中 "output parameters" 的确切含义是什么?它是在谈论 ADO.NET 参数定义,还是服务器端定义,或两者兼而有之?

我不想依赖我的反复试验结果,因为我看到的行为可能是某些我尚未确定的复杂因素的结果。

What does this ADO.NET document mean, precisely, by "output parameters"? Is it talking about the ADO.NET parameter definition, or the server-side definition, or both?

两者都

要接收输出值,您应该在 SP 定义和 ADO.NET SqlCommand 中指定方向(输出或 InputOutput)。

P.S。此行为类似于 sp_executesql:

DECLARE @i INT = 1
EXEC sp_executesql N'SET @i = @i+1', N'@i INT OUTPUT', @i OUTPUT
SELECT @i -- returns 2