考虑这个简单的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参数定义,还是服务器端定义,或两者兼而有之?
我不想依赖我的试错结果,因为我看到的行为可能是我尚未发现的一些复杂因素的结果。
答案 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