无法设置为'System.Decimal'值。您必须将此属性设置为类型为“System.Double”的非null值

时间:2014-01-06 10:04:29

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

您好我正在使用mvc示例从数据库中获取数据。这里我得到了一个错误

  

异常详细信息:System.InvalidOperationException:'number'   'Employee'上的属性无法设置为'System.Decimal'值。   您必须将此属性设置为类型的非null值   'System.Double'。

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

请在此处查看我的代码,我收到了上述错误。

public ActionResult Details(int id)
{
    EmployeeContext empcon = new EmployeeContext();
    Employee employ = empcon.employees.Single(emp => emp.empid == id);
    return View(employ);
}

Routiconfig

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    RouteTable.Routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "emp", action = "Details", 
                        id = UrlParameter.Optional }
        );
}

9 个答案:

答案 0 :(得分:11)

我认为可能是因为null值转换尝试存储在double中。

double更改为

double?

有关说明,请参阅以下链接: http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx

谢谢!

答案 1 :(得分:8)

这可能是DB的问题,从我的经验来看,我得到了这个例外,因为我使用了store-procedure中的数据(使用实体框架生成对象类)

我的SP中的一个数字字段我提供了这样的数据合同

CAST(NULL AS DECIMAL) AS UnitAmount

所以在我的代码中(在实体框架生成类之后)我得到了包含

的类
Decimal UnitAmount{get;set;}

但是当我运行我的代码时会发生此错误

  

...无法设置为System.Int32'值。您必须设置此属性   到类型为' System.Decimal'的非空值。

它是因为在我的SP中有一个案例条件,我返回我的结果,因此数据类型返回不匹配。

-- if no data
Select ... ,
       0  as UnitAmount, 
       ....

如果你没有投射/转换结果 0 - >它将被视为Int32(0.00->看作十进制,)

答案 2 :(得分:5)

使用

public decimal number { get; set; } 

public double number { get; set; }

link

答案 3 :(得分:1)

在我的情况下,视图存在问题,当存在空值时返回值。

像“ISNULL(dbo.STOCK_ITEMS.STDCOST,0)AS STDCOST”

然后没有用。

尝试“ISNULL(dbo.STOCK_ITEMS.STDCOST,0.0)AS STDCOST”

也没有用,但以下工作......

ISNULL(dbo.STOCK_ITEMS.STDCOST, 0.00) AS STDCOST

现在全部工作......

答案 4 :(得分:1)

在我的情况下,问题出在错误的DB列类型 - numeric ,属性 long 。所以我只需要将列重新创建为 bigint

答案 5 :(得分:0)

我遇到了类似的问题,说“无法设置为'Decimal'值。您必须将此属性设置为'Int32'类型的非null值。”一列。我搜索了解决方案,发现我在解决方案中将此列设置为Int。但在数据库中,它被设置为钱,而不是int。所以我在数据库级别更改了它。它有效。

答案 6 :(得分:0)

我遇到的情况是我无法更改表中列的类型(大项目,很多依赖项)。

我有一个View将数据输入到类定义中,类似于:

    SELECT Name,Phone,ID FROM People

这里,我的ID是int类型,但是被用作类型字符串。为了解决这个问题,我改为构建我的View:

    SELECT Name, Phone, CONVERT(NVARCHAR(2), ID) AS ContactMethodTypeId FROM People

将CONVERT放在有问题的类型周围,它将返回指定的类型。就我而言,NVARCHAR。

答案 7 :(得分:0)

SQL中的小数与.Net中的小数不同。如果查看SqlDbType枚举表,您会发现SQL十进制等效于double类型。

来自C# References

  

浮子>双。浮点数在-1.79E +308到1.79E +308的范围内。

public double? number { get; set; }

答案 8 :(得分:0)

就我而言,从float更改了代码?加倍? & 有用。

 public double? number { get; set; }

我的数据库表列类型为float。