Я пытаюсь вызвать хранимую процедуру из своего приложения 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();
Я также пробовал использовать a DataSet
для получения возвращаемого значения с тем же результатом. Что мне не хватает для получения возвращаемого значения из моей хранимой процедуры? Если потребуется дополнительная информация, дайте мне знать.
@ReturnVal
в хранимую процедуру?OUTPUT
параметр или набор результатов.Я знаю, что это старый, но я наткнулся на него с 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;
источник
ExecuteScalar();
будет работать, но выходной параметр будет лучшим решением.источник
Вы можете попробовать использовать выходной параметр. http://msdn.microsoft.com/en-us/library/ms378108.aspx
источник
У меня была аналогичная проблема с вызовом SP, возвращающим ошибку, что ожидаемый параметр не был включен. Мой код был следующим.
Хранимая процедура:
И С #:
При устранении неполадок я понял, что хранимая процедура ДЕЙСТВИТЕЛЬНО ищет направление «InputOutput», поэтому следующее изменение устранило проблему.
r
источник
Или если вы используете 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; }
источник
Это очень короткий пример возврата одного значения из процедуры:
SQL:
CREATE PROCEDURE [dbo].[MakeDouble] @InpVal int AS BEGIN SELECT @InpVal * 2; RETURN 0; END
C # -код:
int inpVal = 11; string retVal = "?"; using (var sqlCon = new SqlConnection( "Data Source = . ; Initial Catalog = SampleDb; Integrated Security = True;")) { sqlCon.Open(); retVal = new SqlCommand("Exec dbo.MakeDouble " + inpVal + ";", sqlCon).ExecuteScalar().ToString(); sqlCon.Close(); } Debug.Print(inpVal + " * 2 = " + retVal); //> 11 * 2 = 22
источник
Я вижу, что другой закрыт. Итак, вот пример моего кода. Я думаю, вам не хватает строкового комментария cmd. Например, если моя процедура хранения называется вызовом: DBO.Test. Мне нужно было бы написать cmd = "DBO.test". Затем введите тип команды, равный процедуре сохранения, и бла-бла-бла
Connection.open(); String cmd="DBO.test"; //the command Sqlcommand mycommand;
источник