2015-10-04 221 views
1

我在存儲過程中使用了SQL Server中的函數並返回RESULT一個小數。爲什麼我得到這個錯誤?

在C#中我需要得到它,但我得到一個錯誤:

「 型‘system.invaildCastException’的例外「INVALLD CastEXCEPTION是由用戶代碼unhandeld」出現......」

我的C#代碼:

decimal? val = null;  

SqlConnection con = new SqlConnection(conStr); 
con.Open(); 

using (con) 
{ 
    SqlCommand cmd = new SqlCommand("dbo.spSetOrderDetails", con); 
    cmd.CommandType = CommandType.StoredProcedure; 

    SqlParameter tvpParam = cmd.Parameters.AddWithValue("@OrderDetailsItemsTVP", dt); 
    tvpParam.SqlDbType = SqlDbType.Structured; 

    // this part of code return the SUM 
    SqlParameter returnParam = cmd.Parameters.Add("@RESULT", SqlDbType.Decimal); 
    returnParam.Direction = ParameterDirection.ReturnValue; 

    cmd.ExecuteNonQuery(); 

    val = (decimal)cmd.Parameters["@RESULT"].Value;--HERE I GET THE EXCEPTION 
} 

con.Close(); 
return (decimal)val; 
+1

cmd.Parameters [「@ RESULT」。值可能爲NULL,你不能將NULL轉換爲不可爲空的小數。 –

+1

你不能帶方向的參數返回值是T-SQL中的RETURN狀態值的值,該值只能是一個整數 – Steve

回答

2

您不能將參數與ParameterDirection.ReturnValue轉換爲非整數的數據類型。

The RETURN statement在T-SQL中只能返回整數值。

但是,如果你是絕對肯定的是,你的存儲過程總是像RETURN XXX結束,那麼你可以

val = Convert.ToDecimal(cmd.Parameters["@RESULT"].Value); 
+0

SQL服務器允許通過dbulll列調用.Value嗎? – Adrian

+1

Direction = ReturnValue的參數包含T-SQL RETURN語句的值,這裏沒有涉及的列 – Steve

+0

這是行得通的。 TNX – yaniv2266

1
var res = cmd.Parameters["@RESULT"]; 

if(res != null && res.Value != null && res.Value != DbNull.value){ 
val = Convert.ToDecimal(res.Value); 
} 
else 
val = defaultvalue; 

此代碼WIL l檢查它是否爲null或等於dbnull.value。只有在它不是null或dbnull.value時纔會投射。在null(或dbnull.value)的情況下,它將簡單地將該值設置爲defaultvalue爲十進制。

+0

這段代碼檢查dbnull.value,如果數據庫的列值爲空值,它將同時檢查null和dbnull.value否則設置默認值; – Adrian

+0

convert.ToDecimal如果失敗則不會發生異常,它只會返回零(來自其他答案)。這段代碼只會強制轉換那些不爲空的元素,否則設置爲默認值。 – Adrian

+1

@PatrickHofman答案已更新。 – Adrian

相關問題