【问题标题】:The specified cast from a materialized 'System.Double' type to the 'System.Int32' type is not valid But no Double defined从具体化的“System.Double”类型到“System.Int32”类型的指定转换无效但未定义 Double
【发布时间】:2017-05-21 20:51:24
【问题描述】:

您好, 我正在开发一个程序,我在其中做一些我认为非常简单的事情,我创建了一个视图,其中三列定义为字符串、整数和日期时间。 (如下图)

Create View [dbo].[vw_findFaulty]
AS
WITH CTE_getMAXDate AS
(
    Select DeviceId,MAX(Createtime) as maxLastDate
    from locationhistory
    group by DeviceId
)
SELECT B.DeviceName,DeviceId,maxLastDate FROM CTE_getMAXDate A
INNER JOIN dbo.devices B 
ON A.DeviceId=B.id
where maxLastDate < dateadd(week,-3,getdate())

我将视图导入到我的模型中,当我检查数据类型的属性时,它是字符串、int32 和日期时间。

但是,当我调用我的方法来尝试加载我的简单视图时。

public ActionResult fault()
{ 
     var findFaulty = db.vw_findFaulty;
     return View(findFaulty.ToList());
}

我收到错误The specified cast from a materialized 'System.Double' type to the 'System.Int32' type is not valid.

除了我找不到任何对“双重”的引用之外,我 110% 确信这在以前是有效的。 如果有人能指导我到哪里可以找到这个错误,我将不胜感激。

谢谢

【问题讨论】:

    标签: c# asp.net-mvc-5


    【解决方案1】:

    假设数据库模型属性如下所示:

    public int DeviceId { get; set; }
    public string DeviceName { get; set; }
    public DateTime maxLastDate { get; set; }
    

    作为一种快速修复方法,有必要使用CAST 子句确保视图返回完全相同的数据类型:

    CREATE VIEW [dbo].[vw_findFaulty]
    AS
    WITH CTE_getMAXDate AS
    (
        SELECT DeviceId, MAX(Createtime) AS maxLastDate
        FROM locationhistory
        GROUP BY DeviceId
    )
    
    -- explicit cast for DeviceId
    -- if DATETIME column also returning similar error, use CAST(maxLastDate AS DATETIME)
    SELECT B.DeviceName, CAST(DeviceId AS INT), maxLastDate FROM CTE_getMAXDate AS A
    INNER JOIN dbo.devices AS B 
    ON A.DeviceId = B.id
    WHERE maxLastDate < DATEADD(week, -3, GETDATE())
    

    问题似乎源于从视图传递到指定模型类的数据类型,因为来自 SQL 数据库的绑定结果集需要在 SQL 数据类型与 CLR 类型之间进行转换和匹配(请注意,无法保证查询结果将返回预期的数据类型),即查询返回的DeviceId 的数据类型可能与分配的模型类型不匹配。

    类似问题:

    Linq - The specified cast from a materialized 'System.Int32' type to the 'System.Double' type is not valid

    【讨论】:

      【解决方案2】:

      我在使用 EntityFramework 时遇到了类似的问题。只需从表中选择两列,然后创建一个匿名类型,例如

      ctx.mytable.Select(f=&gt;new{f.column1, f.column2});

      在测试中工作,而不是在生产中。

      问题是 column2 的生产数据库中的数据类型与我的实体模型 (edmx) 不同。

      在测试 column2 是一个 tinyint,在生产中是一个 int。该模型是一个 tinyint。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多