Можете ли вы использовать cmd.ExecuteScalar, когда sproc использует RETURN @value - PullRequest
5 голосов
/ 06 февраля 2009

Можете ли вы использовать

int blah = Convert.ToInt32(cmd.ExecuteScalar());

Когда последний оператор sproc делает:

RETURN @value

Я могу заставить его работать, только если это так:

SELECT @ value

Кроме того, это дает мне исключение null объекта:

int blah = (int)cmd.ExecuteScalar();

это не convert.toint32 и (int) одно и то же, но один является оберткой другого?

Ответы [ 2 ]

8 голосов
/ 06 февраля 2009

Нет, вы не можете. Метод ExecuteScalar () предназначен для возврата в виде одного значения, которое возвращается в наборе результатов. В основном, возвращено значение в первом столбце первой строки.

Чтобы получить возвращаемое значение, вам нужно добавить параметр в ваш объект SQLCommand. Используйте имя "@RETURN_VALUE" и укажите направление параметра Return при создании объекта параметра. Затем вы можете использовать метод ExecuteNonQuery ().

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

3 голосов
/ 06 февраля 2009

Чтобы ответить на ваш другой вопрос, (int) - это приведение, которое в действительности отличается от преобразования (Convert.ToInt32).

В приведении типа вы как бы говорите, что объект, который будет приведен, действительно относится к тому типу, к которому вы приводите, поэтому никакого реального преобразования / анализа не выполняется. Поскольку int не может быть нулевым, приведение недействительно, если объект, который вы приводите, имеет значение null, и генерируется исключение.

С преобразованием происходит некоторый фактический синтаксический анализ и логика, и он обрабатывает ситуацию, когда преобразуемый объект является нулем.

Подробнее об этом здесь .

...