Другой ответ показывает , что это, но по сути вам просто нужно создать SqlParameter
, установить , Direction
чтобы Output
, и добавить его в SqlCommand
«s Parameters
коллекции. Затем выполните хранимую процедуру и получите значение параметра.
Используя ваш пример кода:
// SqlConnection and SqlCommand are IDisposable, so stack a couple using()'s
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("sproc", conn))
{
// Create parameter with Direction as Output (and correct name and type)
SqlParameter outputIdParam = new SqlParameter("@ID", SqlDbType.Int)
{
Direction = ParameterDirection.Output
};
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(outputIdParam);
conn.Open();
cmd.ExecuteNonQuery();
// Some various ways to grab the output depending on how you would like to
// handle a null value returned from the query (shown in comment for each).
// Note: You can use either the SqlParameter variable declared
// above or access it through the Parameters collection by name:
// outputIdParam.Value == cmd.Parameters["@ID"].Value
// Throws FormatException
int idFromString = int.Parse(outputIdParam.Value.ToString());
// Throws InvalidCastException
int idFromCast = (int)outputIdParam.Value;
// idAsNullableInt remains null
int? idAsNullableInt = outputIdParam.Value as int?;
// idOrDefaultValue is 0 (or any other value specified to the ?? operator)
int idOrDefaultValue = outputIdParam.Value as int? ?? default(int);
conn.Close();
}
Будьте осторожны при получении Parameters[].Value
, поскольку тип должен быть приведен object
к тому, как вы его объявляете. И SqlDbType
используется при создании SqlParameter
потребностей, чтобы соответствовать типу в базе данных. Если вы собираетесь просто выводить его на консоль, вы можете просто использовать Parameters["@Param"].Value.ToString()
(явно или неявно через вызов Console.Write()
или String.Format()
).
РЕДАКТИРОВАТЬ: более 3,5 лет и почти 20 тысяч просмотров, и никто не удосужился упомянуть, что он даже не компилировался по причине, указанной в моем комментарии «будьте осторожны» в исходном сообщении. Ницца. Исправлено на основе хороших комментариев от @Walter Stabosz и @Stephen Kennedy и для соответствия редактированию кода обновления в вопросе от @abatishchev.
conn.Close()
как это внутриusing
блокаДля тех, кто хочет сделать что-то подобное, используя средство чтения с хранимой процедурой, обратите внимание, что средство чтения должно быть закрыто, чтобы получить выходное значение.
источник
Не мой код, но хороший пример, я думаю
источник: http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=624
источник
Шрифт http://www.codeproject.com/Articles/748619/ADO-NET-How-to-call-a-stored-procedure-with-output
источник
источник
Вы можете получить свой результат с помощью кода ниже:
источник
Создайте SqlParamObject, который предоставит вам контроль над методами доступа к параметрам.
:
УСТАНОВИТЕ Имя для вашего параметра (оно должно быть таким же, как если бы вы объявили переменную для хранения значения в вашей базе данных)
:
param.ParameterName = "@yourParamterName";
Очистите держатель значения, чтобы хранить выходные данные
:
param.Value = 0;
Установите направление по вашему выбору (в вашем случае это должен быть выход)
:
param.Direction = System.Data.ParameterDirection.Output;
источник
Для меня это выглядит более явным:
источник