2016-01-07 105 views
1

我想運行一個sql存儲過程並從查詢中返回一個值。我的語法拋出的錯誤:從SQL查詢返回參數

無法隱式轉換類型「System.Data.SqlClient.SqlParameter」到「小數」

這是我的語法,我應該怎樣纔能有這種改變正常運行?

public Decimal ReturnValueFromQuery(string connectionString, string sqlQuery, int blah, DateTime d1, DateTime d2) 
{ 
string cs = System.Configuration.ConfigurationManager.AppSettings[connectionString].ToString(); 
try 
{ 
    using (SqlConnection conn = new SqlConnection(cs)) 
    using (SqlCommand cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = sqlQuery; 
     cmd.Connection = conn; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add("@blah", SqlDbType.Int).Value = blah; 
     cmd.Parameters.Add("@startDate", SqlDbType.Date).Value = d1; 
     cmd.Parameters.Add("@endDate", SqlDbType.Date).Value = d2; 
     var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int); 
     returnParameter.Direction = ParameterDirection.ReturnValue; 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     return returnParameter; 
    } 
} 
catch { } 
} 
+3

錯誤消息說全部 –

+0

如果你不能隱式地轉換某些東西,通常顯式轉換它的工作原理(如果與它相關的數據是無論如何都是兼容的)。 – user2366842

+0

顯式轉換爲從SQL返回的值的十進制數。 –

回答

6

你的方法說,它會返回一個小數,寫return returnParameter是不可能的,因爲它不尊重你的方法的簽名。

你應該返回參數的Value財產轉換爲十進制值

return Convert.ToDecimal(returnParameter.Value); 

不過,我對自己的選擇使用參數與ParameterDirection.ReturnValue一些困惑。正如您已正確書寫(SqlDbType.Int),這些參數只能返回整數而非小數。也許,你應該考慮一個參數ParameterDirection.Output並將其傳遞到存儲過程的調用列表中

當然,如果你真的有一個整數,那麼也有可能將你的方法返回值改爲int。
最後,我強烈建議刪除任何空的catch塊。當你有異常時,這些塊是致命的,因爲你永遠不知道它。

+1

返回類型定義的好結果。唯一的原因,我真的可以想到這可能是有道理的是,如果返回值然後被傳遞到其他函數,在別處使用,但期望一個十進制值傳遞給它..(編輯:這是說,它應該真的如果這實際上發生了什麼......) – user2366842

+0

在任何情況下,如果他真的想要返回小數點,他將面臨信息鬆散的風險。 (小數部分會丟失) – Steve