Получите значение выходного параметра в ADO.NET

90
задан abatishchev 8 May 2012 в 18:22
поделиться

2 ответа

Другой ответ показывает это, но по существу просто необходимо создать 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.

114
ответ дан BQ. 24 November 2019 в 06:59
поделиться

Не мой код, но хороший пример я думаю

источник: 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(); 
    } 
} 
28
ответ дан Walter Stabosz 24 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: