Вызов хранимой процедуры с возвращаемым значением - PullRequest
68 голосов
/ 02 июня 2011

Я пытаюсь вызвать хранимую процедуру из моего приложения на C # windows. Хранимая процедура выполняется на локальном экземпляре 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 для получения возвращаемого значения с тем же результатом. Чего мне не хватает, чтобы получить возвращаемое значение из моей хранимой процедуры? Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Ответы [ 8 ]

127 голосов
/ 02 июня 2011

Вам необходимо добавить возвращаемый параметр в команду:

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;
}
4 голосов
/ 05 сентября 2014

Я знаю, что это старый, но я наткнулся на него с Google.

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

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

    cmd.ExecuteNonQuery();
    rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value;
4 голосов
/ 02 июня 2011

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

3 голосов
/ 07 ноября 2016

Версия 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;
2 голосов
/ 09 мая 2017

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

@ Result int OUTPUT

И С #:

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

При устранении неполадок я понял, что хранимая процедура на самом деле ищет направление «InputOutput», поэтому следующее изменение устранило проблему.

            r

Result.Direction = ParameterDirection.InputOutput;

2 голосов
/ 02 июня 2011

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

0 голосов
/ 21 ноября 2014

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

Connection.open();
String cmd="DBO.test"; //the command
Sqlcommand mycommand;
0 голосов
/ 31 октября 2013

Или если вы используете 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;
}
...