Другой ответ показывает это, но по существу просто необходимо создать SqlParameter
, установить Direction
на Output
и добавить его к SqlCommand
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()
(или explictly или неявно через Console.Write()
или String.Format()
вызов).
РЕДАКТИРОВАНИЕ: более чем 3,5 года и почти 20k представления и никто не потрудился упоминать, что это даже не скомпилировало по причине, определенной в мой "быть тщательным" комментарием в исходном сообщении. Хороший. Зафиксированный это на основе хороших комментариев от @Walter Stabosz и @Stephen Kennedy и соответствовать обновлению кодирует редактирование в вопросе от @abatishchev.
Не мой код, но хороший пример я думаю
источник: http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=624
using System;
using System.Data;
using System.Data.SqlClient;
class OutputParams
{
[STAThread]
static void Main(string[] args)
{
using( SqlConnection cn = new SqlConnection("server=(local);Database=Northwind;user id=sa;password=;"))
{
SqlCommand cmd = new SqlCommand("CustOrderOne", cn);
cmd.CommandType=CommandType.StoredProcedure ;
SqlParameter parm= new SqlParameter("@CustomerID",SqlDbType.NChar) ;
parm.Value="ALFKI";
parm.Direction =ParameterDirection.Input ;
cmd.Parameters.Add(parm);
SqlParameter parm2= new SqlParameter("@ProductName",SqlDbType.VarChar);
parm2.Size=50;
parm2.Direction=ParameterDirection.Output;
cmd.Parameters.Add(parm2);
SqlParameter parm3=new SqlParameter("@Quantity",SqlDbType.Int);
parm3.Direction=ParameterDirection.Output;
cmd.Parameters.Add(parm3);
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
Console.WriteLine(cmd.Parameters["@ProductName"].Value);
Console.WriteLine(cmd.Parameters["@Quantity"].Value.ToString());
Console.ReadLine();
}
}