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
考虑这个简单的 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