2015-10-04 192 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

相关问题