2009-02-06 3 views
5

Вы можете использоватьВы можете использовать cmd.ExecuteScalar когда sproc использует RETURN @value

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

Когда последнее заявление sproc в делает:

RETURN @value 

я могу только получить его на работу, если он делает :

ВЫБОР @value

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

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

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

ответ

8

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

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

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

3

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

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

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

Есть дополнительная информация об этом here.

Смежные вопросы