Вызов хранимой процедуры с возвращаемым значением
Я пытаюсь вызвать хранимую процедуру из моего приложения 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
для получения возвращаемого значения с тем же результатом. Что мне не хватает, чтобы получить
возвращаемое значение из моей хранимой процедуры? Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.
Ответы
Ответ 1
Вам нужно добавить параметр 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;
}
Ответ 2
Я знаю, что это старо, но я наткнулся на него с помощью Google.
Если у вас есть возвращаемое значение в вашей хранимой процедуре, скажите "Return 1" - не используя выходные параметры.
Вы можете сделать следующее: "@RETURN_VALUE" тихо добавляется к каждому объекту команды. НЕТ НЕСКОЛЬКО ДОБАВИТЬ ДОБАВИТЬ
cmd.ExecuteNonQuery();
rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value;
Ответ 3
ExecuteScalar() будет работать, но выходной параметр будет лучшим решением.
Ответ 4
Вы можете попробовать использовать выходной параметр. http://msdn.microsoft.com/en-us/library/ms378108.aspx
Ответ 5
В версии 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;
Ответ 6
Или, если вы используете 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;
}
Ответ 7
У меня была аналогичная проблема с вызовом SP, возвращающим ошибку, что ожидаемый параметр не был включен. Мой код был следующим.
Сохраненная процедура:
@Result int OUTPUT
И С#:
SqlParameter result = cmd.Parameters.Add(new SqlParameter("@Result", DbType.Int32));
result.Direction = ParameterDirection.ReturnValue;
В поиске и устранении неисправностей я понял, что хранимая процедура была ФАКТИЧЕСКИ ищет направление "InputOutput", поэтому следующее изменение устранило проблему.
r
Result.Direction = ParameterDirection.InputOutput;
Ответ 8
Я вижу, что другой закрыт. Так что в основном здесь грубо мой код. Я думаю, что вам не хватает комментария cmd строки. Например, если моя процедура магазина вызвана: DBO.Test. Мне нужно будет написать cmd = "DBO.test". Затем введите тип команды, равный процедуре хранения, и blah blah blah
Connection.open();
String cmd="DBO.test"; //the command
Sqlcommand mycommand;