【问题标题】:SQL Server TIMESTAMP values OUTPUT parameters and ADO.NETSQL Server TIMESTAMP 值 OUTPUT 参数和 ADO.NET
【发布时间】:2017-04-24 18:56:33
【问题描述】:

考虑这个简单的 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 参数定义,还是服务器端定义,或两者兼而有之?

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

【问题讨论】:

  • SP 返回 0 或 1
  • 我不明白你的评论,萨米。它似乎与我询问的关于 parameter 方向性的具体问题无关。我不是在问返回值。
  • @Sami 一个存储过程的返回值是一个整数,而不是一个非空位。

标签: sql-server parameters ado.net sqlcommand


【解决方案1】:

这个 ADO.NET 文档的确切含义是“输出 参数”?它是在谈论 ADO.NET 参数定义,还是 服务器端定义,还是两者都有?

两者

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

附:此行为类似于sp_executesql:

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

【讨论】:

  • T-SQL 是否也支持 InputOutput?还是只是(默认)IN 或 OUT?
  • T-SQL 中的所有OUTPUT 参数都是InputOuput。我添加了示例
  • 谢谢,最后的评论澄清了一切。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多