SQL Server TIMESTAMP значения ВЫХОДНЫХ параметров и 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 быть объявлен OUTPUT в SP, чтобы через команду UpdateCommand dataAdapter возвращалась последняя метка времени? Или направление параметра IN на стороне сервера по умолчанию вернет значение, если для направления ADO.NET установлено значение ParameterDirection.InputOutput?

См. эту документацию по RowUpdating:

"Если есть выходные параметры, они помещаются в DataRow."

Что именно означает этот документ ADO.NET под «выходными параметрами»? Речь идет об определении параметра ADO.NET, или об определении на стороне сервера, или о том и другом?

Я не хочу полагаться на результаты своих проб и ошибок, поскольку поведение, которое я вижу, может быть результатом какого-то усложняющего фактора, который я еще не определил.


person Tim    schedule 24.04.2017    source источник
comment
SP вернуть 0 или 1   -  person Ilyes    schedule 24.04.2017
comment
Я не понимаю твоего комментария, Сами. Кажется, это не относится к конкретному вопросу, который я задаю о направленности parameter. Я не спрашиваю о возвращаемых значениях.   -  person Tim    schedule 24.04.2017
comment
@Sami возвращаемое значение хранимой процедуры является целым числом, а не ненулевым битом.   -  person Sean Lange    schedule 24.04.2017


Ответы (1)


Что именно означает этот документ ADO.NET под «выходными параметрами»? Речь идет об определении параметра ADO.NET, или об определении на стороне сервера, или о том и другом?

Оба

Чтобы получить выходное значение, вы должны указать направление (выход или InputOutput) ОБА в определении SP и в вашей ADO.NET SqlCommand.

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
person Mikhail Lobanov    schedule 25.04.2017
comment
Поддерживает ли T-SQL InputOutput? или только (по умолчанию) IN или OUT? - person Tim; 25.04.2017
comment
Все параметры OUTPUT в T-SQL являются входными и выходными. я добавил пример - person Mikhail Lobanov; 26.04.2017
comment
Спасибо, последний комментарий все проясняет. - person Tim; 26.04.2017