Как получить возвращаемые значения хранимой процедуры из адаптера таблицы

Я не могу найти элегантный способ получить возвращаемое значение из хранимой процедуры при использовании адаптеров таблиц.

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

Я видел в сети несколько уродливых хаков для решения этой проблемы, но достойного решения не было. Любая помощь будет оценена по достоинству.

Действительно, у меня такая же проблема, смешно, что возвращаемые значения не поддерживаются, без взлома

nicodemus13 19.12.2008 18:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
8 217
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Способ получить возвращаемое значение - использовать SqlParameter в объекте SqlCommand, для которого Direction установлено значение ParameterDirection.ReturnValue. Вы должны проверить свойство SelectCommand TableAdapter после вызова Fill.

Свойство SelectCommand (AFAIK) является частным для TableAdapter. Поэтому мне пришлось бы расширить каждый адаптер TableAdapter частичным классом, который, на мой взгляд, не является изящным решением, которое я надеюсь найти.

Chris Driver 17.09.2008 15:18

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

SET ROWCOUNT OFF

BEGIN
<Procedure Content>
END

SET ROWCOUNT ON

Спасибо за предложение, но, к сожалению, установка ROWCOUNT не решает мою проблему.

Chris Driver 02.10.2008 13:44

ПРИМЕЧАНИЕ: лучше всего использовать 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 фактический скаляр, который вы хотите вернуть.

Другие вопросы по теме