【问题标题】:Why I'm getting this error?为什么我会收到此错误?
【发布时间】:2016-01-01 05:08:51
【问题描述】:

我在 SQL Server 中使用函数并返回 RESULT 小数的存储过程。

在 C# 中我需要得到它,但我得到一个错误:

“INVALLD CastEXCEPTION 未被用户代码处理”“异常 类型'system.invaildCastException'发生...'

我的 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;

【问题讨论】:

  • cmd.Parameters["@RESULT"].Value 可能为 NULL,您不能将 NULL 转换为不可为空的十进制数。
  • 你不能 带方向 ReturnValue 的参数是 T-SQL 中 RETURN 语句的值,该值只能是整数

标签: c# sql sql-server asp.net-mvc asp.net-mvc-4


【解决方案1】:

您不能将带有 ParameterDirection.ReturnValue 的参数转换为非整数的数据类型。

T-SQL 中的The RETURN statement 只能返回整数值。

但是,如果您绝对确定您的存储过程总是以 RETURN xxx 之类的结尾,那么您可以

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

【讨论】:

  • SQL server 允许在 dbulll 列上调用 .Value 吗?
  • Direction = ReturnValue的参数包含T-SQL RETURN语句的值,这里不涉及列
【解决方案2】:
var res = cmd.Parameters["@RESULT"];

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

此代码将检查它是否为空或等于 dbnull.value。仅当它不是 null 或 dbnull.value 时才会强制转换。如果为 null(或 dbnull.value),它将简单地将值设置为十进制的默认值。

【讨论】:

  • 这段代码检查dbnull.value,如果数据库的列有空值,它将同时检查null和dbnull.value,否则设置默认值;
  • convert.ToDecimal 如果失败则不会例外,它只是返回零(来自另一个答案)。此代码将只转换那些不为空的,否则设置默认值。
  • 检查参数对象(不是它的值)是null还是dbnull的目的是什么?该参数已在前两行添加到参数集合中,因此我们非常确定它存在。问题是无效的转换异常而不是空引用异常
  • @Steve 其实我第一次看到这种东西。我主要使用 MySQL。
猜你喜欢
  • 2018-06-22
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
相关资源
最近更新 更多