SQL Server TIMESTAMP值OUTPUT参数和ADO.NET

时间:2017-04-24 18:56:33

标签: sql-server parameters ado.net sqlcommand

考虑这个简单的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专家的问题:是否必须在SP中声明@rowversion参数OUTPUT,以便通过dataAdapter的UpdateCommand返回最新的时间戳?或者,如果ADO.NET方向设置为ParameterDirection.InputOutput,IN的默认服务器端参数方向是否会返回值?

请参阅RowUpdating事件的此文档:

“如果有输出参数,则将它们放在DataRow中。”

这个ADO.NET文档准确地说是“输出参数”是什么意思?它是在谈论ADO.NET参数定义,还是服务器端定义,或两者兼而有之?

我不想依赖我的试错结果,因为我看到的行为可能是我尚未发现的一些复杂因素的结果。

1 个答案:

答案 0 :(得分:1)

  

这个ADO.NET文档正是通过"输出的意思   参数&#34 ;?它是在谈论ADO.NET参数定义,还是   服务器端定义,或两者兼而有之?

两个

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

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