2012-08-24 54 views
0

這就是我所擁有的,我只是想知道這是否是正確的方式來做到這一點,如果不是這樣,那麼最優的方法是什麼。獲取執行的存儲過程的返回值的正確和最優方法是什麼?

public static int AddPullSubscription(string connectionString) 
{ 
    try 
    { 
     using (SqlConnection conn = new SqlConnection(connectionString)) 
     { 
      using (SqlCommand cmd = new SqlCommand("", conn)) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 

       var returnParameter = cmd.Parameters.Add("@RETURN_VALUE", SqlDbType.Int); 
       returnParameter.Direction = ParameterDirection.ReturnValue; 

       cmd.ExecuteNonQuery(); 

       return Convert.ToInt32(returnParameter.Value); 
      } 
     } 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 
+0

這取決於一點點的存儲過程是如何工作的,不是所有的人都使用了參數。但是,如果這對你有用,那麼你的代碼沒有問題。 – CodingGorilla

+0

'Convert.ToInt32(cmd.ExecuteScalar());'應該這樣做。 – Bridge

+0

@CodingGorilla,我想要得到的返回值是運行存儲過程時得到的默認值。 0表示沒有錯誤,其他表示錯誤。 – Testifier

回答

1

這取決於您的存儲過程的結果。

  1. ExecuteNonQuery:如果您只需要受影響的行數。 AFAIK,如果你沒有在你的SP中使用Set NoCount on,它就可以工作。當然,出於性能目的繼續保持。儘管如此,您可以像使用@Return_Value一樣獲得整數值。一個example

  2. ExecuteScalar:如果您選擇的是SQL中任何受支持類型的值。一個example

  3. ExecuteReader:向前瀏覽所選記錄。一個example

也看看this article這是關於捕獲(例外)。

0

也可以使用ExecuteScalar(樣品與整數)

VAR結果=(Int32)已cmd.ExecuteScalar();

+0

我被告知executeScalar不會返回sp的實際返回值。 – Testifier

+0

是的,我知道,但我建議爲你另一個答案,你的代碼是好的 –

0

你可以試試這個:

using (var conn = new SqlConnection(connectionString)) 
    { 
     using (var sqlCmd = new SqlCommand("SEL_StoredProcedure", conn)) 
     { 
       sqlCmd.CommandType = System.Data.CommandType.StoredProcedure; 
       //sqlCmd.Parameters.AddWithValue("@ID", Id); 
       sqlCmd.Connection.Open(); 

       return cmd.ExecuteScalar() as Int32; 
     } 
    } 
相關問題