Вызов хранимой процедуры с возвращаемым значением
Я пытаюсь вызвать хранимую процедуру из моего приложения 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 ответов:
необходимо добавить возвращаемый параметр в команду:
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;
версия 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;
вы можете попробовать использовать выходной параметр. http://msdn.microsoft.com/en-us/library/ms378108.aspx
у меня была аналогичная проблема с вызовом SP, возвращающим ошибку, что ожидаемый параметр не был включен. Мой код был следующим.
Хранимая Процедура:@Result int OUTPUT
И C#:
SqlParameter result = cmd.Parameters.Add(new SqlParameter("@Result", DbType.Int32)); result.Direction = ParameterDirection.ReturnValue;при устранении неполадок я понял, что хранимая процедура на самом деле ищет направление "InputOutput", поэтому следующее изменение исправило проблему.
rрезультат.Направление = ParameterDirection.Операций ввода-вывода;
или если вы используете 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; }
Я вижу, что другой закрыт. Так что в основном вот грубый мой код. Я думаю, что вам не хватает комментария строки cmd. Например, если моя процедура хранения-это вызов: DBO.Тест. Мне нужно будет написать cmd= " DBO.испытание." Затем введите команду, равную процедуре хранения, и бла-бла-бла
Connection.open(); String cmd="DBO.test"; //the command Sqlcommand mycommand;
Comments