Я не могу найти элегантный способ получить возвращаемое значение из хранимой процедуры при использовании адаптеров таблиц.
Похоже, TableAdapter не поддерживает возвращаемые значения хранимой процедуры SQL при использовании нескалярного вызова хранимой процедуры. Вы ожидаете, что возвращаемое значение из автоматически сгенерированной функции будет возвращаемым значением из хранимой процедуры, но это не так (на самом деле это количество затронутых строк). Хотя можно использовать параметры out и передавать переменную в качестве ссылки автоматически сгенерированным функциям, это не очень чистое решение.
Я видел в сети несколько уродливых хаков для решения этой проблемы, но достойного решения не было. Любая помощь будет оценена по достоинству.





Способ получить возвращаемое значение - использовать SqlParameter в объекте SqlCommand, для которого Direction установлено значение ParameterDirection.ReturnValue. Вы должны проверить свойство SelectCommand TableAdapter после вызова Fill.
Свойство SelectCommand (AFAIK) является частным для TableAdapter. Поэтому мне пришлось бы расширить каждый адаптер TableAdapter частичным классом, который, на мой взгляд, не является изящным решением, которое я надеюсь найти.
Я не могу сказать наверняка, потому что я не использую адаптеры таблиц, но вам может потребоваться просмотреть свою хранимую процедуру и включить в нее следующее.
SET ROWCOUNT OFF
BEGIN
<Procedure Content>
END
SET ROWCOUNT ON
Спасибо за предложение, но, к сожалению, установка ROWCOUNT не решает мою проблему.
ПРИМЕЧАНИЕ: лучше всего использовать SqlParameter, где Direction = ParameterDirection.ReturnValue
С учетом сказанного, как кто-то уже упоминал SqlParameters, вот альтернативный динамический метод с использованием DataSet. (если так ты катаешься):
Пример оператора SQL и C# как подмены:
string sql = @"DECLARE @ret int
EXEC @ret = SP_DoStuff 'parm1', 'parm2'
SELECT @ret as ret";
DataSet ds = GetDatasetFromSQL(sql); //your sql to dataset code here...
int resultCode = -1;
int.TryParse(ds.Tables[ds.Tables.Count-1].Rows[0][0].ToString(), out resultCode);
Результаты хранимой процедуры загружаются в DataSet и будут иметь столько таблиц данных, сколько возвращают операторы выбора в хранимой процедуре.
Последний DataTable в DataSet будет иметь 1 строку и 1 столбец, которые будут содержать возвращаемое значение хранимой процедуры.
Закрытие этого вопроса, поскольку кажется, что возвращаемые значения не поддерживаются, и нет элегантного обходного пути!
Фактически, все, что вам нужно сделать, это вернуть окончательное значение из хранимой процедуры с помощью оператора SELECT, а не RETURN. Результатом SELECT будет возвращаемое значение. Например, если вы просто сделаете оператор выхода sp «SELECT 1», вы получите 1. Теперь просто SELECT фактический скаляр, который вы хотите вернуть.
Действительно, у меня такая же проблема, смешно, что возвращаемые значения не поддерживаются, без взлома