Вызов хранимой процедуры с возвращаемым значением

Я пытаюсь вызвать хранимую процедуру из моего приложения Windows C #. Хранимая процедура выполняется в локальном экземпляре SQL Server 2008. Я могу вызвать хранимую процедуру, но я не могу получить значение обратно из хранимой процедуры. Предполагается, что эта хранимая процедура вернет следующее число в последовательности. Я провел исследование в Интернете, и все сайты, которые я видел, указали на это решение.

Код хранимой процедуры:

ALTER procedure [dbo].[usp_GetNewSeqVal] @SeqName nvarchar(255) as begin declare @NewSeqVal int set NOCOUNT ON update AllSequences set @NewSeqVal = CurrVal = CurrVal+Incr where SeqName = @SeqName if @@rowcount = 0 begin print 'Sequence does not exist' return end return @NewSeqVal end 

Код, вызывающий хранимую процедуру:

 SqlConnection conn = new SqlConnection(getConnectionString()); conn.Open(); SqlCommand cmd = new SqlCommand(parameterStatement.getQuery(), conn); cmd.CommandType = CommandType.StoredProcedure; SqlParameter param = new SqlParameter(); param = cmd.Parameters.Add("@SeqName", SqlDbType.NVarChar); param.Direction = ParameterDirection.Input; param.Value = "SeqName"; SqlDataReader reader = cmd.ExecuteReader(); 

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

Вам нужно добавить параметр return в команду:

 using (SqlConnection conn = new SqlConnection(getConnectionString())) using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = parameterStatement.getQuery(); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("SeqName", "SeqNameValue"); var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int); returnParameter.Direction = ParameterDirection.ReturnValue; conn.Open(); cmd.ExecuteNonQuery(); var result = returnParameter.Value; } 

Я знаю, что это старо, но я наткнулся на него с помощью Google.

Если у вас есть возвращаемое значение в вашей хранимой процедуре, скажите «Return 1» – не используя выходные параметры.

Вы можете сделать следующее: «@RETURN_VALUE» тихо добавляется к каждому объекту команды. НЕТ НЕСКОЛЬКО ДОПОЛНИТЕЛЬНО ДОБАВИТЬ

  cmd.ExecuteNonQuery(); rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value; 

ExecuteScalar () будет работать, но выходным параметром будет превосходное решение.

Вы можете попробовать использовать выходной параметр. http://msdn.microsoft.com/en-us/library/ms378108.aspx

Версия EnterpriseLibrary на моей машине имела другие параметры. Это работало:

  SqlParameter retval = new SqlParameter("@ReturnValue", System.Data.SqlDbType.Int); retval.Direction = System.Data.ParameterDirection.ReturnValue; cmd.Parameters.Add(retval); db.ExecuteNonQuery(cmd); object o = cmd.Parameters["@ReturnValue"].Value; 

Или если вы используете EnterpriseLibrary, а не стандартный ADO.NET …

 Database db = DatabaseFactory.CreateDatabase(); using (DbCommand cmd = db.GetStoredProcCommand("usp_GetNewSeqVal")) { db.AddInParameter(cmd, "SeqName", DbType.String, "SeqNameValue"); db.AddParameter(cmd, "RetVal", DbType.Int32, ParameterDirection.ReturnValue, null, DataRowVersion.Default, null); db.ExecuteNonQuery(cmd); var result = (int)cmd.Parameters["RetVal"].Value; } 

У меня была аналогичная проблема с вызовом SP, возвращающим ошибку, что ожидаемый параметр не был включен. Мой код был следующим.
Хранимая процедура:

@Result int OUTPUT

И C #:

  SqlParameter result = cmd.Parameters.Add(new SqlParameter("@Result", DbType.Int32)); result.Direction = ParameterDirection.ReturnValue; 

При поиске и устранении неисправностей я понял, что хранимая процедура была НАСТОЯТЕЛЬНО ищет направление «InputOutput», поэтому следующее изменение устранило проблему.

  r 

Result.Direction = ParameterDirection.InputOutput;

Я вижу, что другой закрыт. Таким образом, в основном это грубое из моего кода. Я думаю, что вам не хватает комментария cmd строки. Например, если моя процедура магазина вызвана: DBO.Test. Мне нужно будет написать cmd = "DBO.test". Затем введите тип команды, равный процедуре хранения, и бла-бла-бла

 Connection.open(); String cmd="DBO.test"; //the command Sqlcommand mycommand; 
Interesting Posts

Обновить столбец электронной почты на основе fullName в T-SQL?

обновление нескольких таблиц с помощью триггеров – SQL Server

Почему я не могу вставить данные в мою базу данных?

Сотрудник, который имеет более высокую зарплату, чем СРЕДНИЙ из его отдела – оптимизирован

«Неправильный синтаксис» с использованием табличной функции в предложении SELECT запроса T-SQL

Inno Setup – «Была предпринята попытка загрузить программу с неправильным форматом» при попытке установить функцию NetFx3

Выберите Count Outer Joins и WHERE

SQL-запрос выполняется в 10 раз медленнее с определенным значением при использовании переменной

Оптимизация запросов SQL Server?

Последние 6 месяцев дублируют записи в SQL Server с помощью t-sql?

SQL Server CTE не присоединяется должным образом

Добавьте столбец со значением по умолчанию в существующую таблицу в SQL Server

Как узнать статус блокировки для строки, не обновляя запись

Всего один столбец из хранимой процедуры

перенос каретки возвращается с сервера oracle на sql

Давайте будем гением компьютера.