Diğer yanıt bunu gösterir, ancak esasen sadece bir tane oluşturmanız SqlParameter, Directiondeğerini ayarlamanız Outputve SqlCommand's Parameterskoleksiyonuna eklemeniz gerekir . Daha sonra saklı yordamı yürütün ve parametrenin değerini alın.
Kod örneğinizi kullanarak:
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("sproc", conn))
{
SqlParameter outputIdParam = new SqlParameter("@ID", SqlDbType.Int)
{
Direction = ParameterDirection.Output
};
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(outputIdParam);
conn.Open();
cmd.ExecuteNonQuery();
int idFromString = int.Parse(outputIdParam.Value.ToString());
int idFromCast = (int)outputIdParam.Value;
int? idAsNullableInt = outputIdParam.Value as int?;
int idOrDefaultValue = outputIdParam.Value as int? ?? default(int);
conn.Close();
}
Türün, ilan ettiğiniz şeye dönüştürülmesi Parameters[].Valuegerektiğinden, alırken dikkatli olun object. Ve veritabanındaki türle eşleşen ihtiyaçları SqlDbTypeoluşturduğunuzda kullanılır SqlParameter. Sadece konsola çıktı olarak verecekseniz, sadece kullanıyor olabilirsiniz Parameters["@Param"].Value.ToString()(açık veya dolaylı olarak bir Console.Write()veya String.Format()çağrı yoluyla ).
DÜZENLEME: 3.5 yıldan fazla ve neredeyse 20.000 görüntülenme ve hiç kimse orijinal gönderideki "dikkatli ol" yorumumda belirtilen nedenle derlemediğinden bahsetmeye zahmet etmemişti. Güzel. @Walter Stabosz ve @Stephen Kennedy'den gelen iyi yorumlara dayanarak ve @abatishchev'den gelen sorudaki güncelleme kodu düzenlemesiyle eşleşecek şekilde düzeltildi.
conn.Close()Birusingbloğun içinde olmasına gerek yok