首页 > 解决方案 > ToList() 中的“InvalidCastException 指定的强制转换无效”

问题描述

我在一个 MVC 4 C# 应用程序中,在其中我显示了一个 oracle 表的记录,但是当我执行它时抛出了这个异常,我从来没有遇到过这个问题。

这是我的代码:

    public ActionResult Index()
    {
        Entities db = new Entities();
        IList<MVC_PCMonitoring_Dash.TB_OP_PC_MONITORING_V4> PCList = new List<MVC_PCMonitoring_Dash.TB_OP_PC_MONITORING_V4>();
        var query = from qrs in db.TB_OP_PC_MONITORING_V4 select qrs;
        var listdata = query.ToList();  // <-- This is where the exception occurs "Specified cast is not valid": 

        foreach (var pcdata in listdata)
        {
            PCList.Add(new TB_OP_PC_MONITORING_V4()
            {
                IDPC = pcdata.IDPC,
                LINE_CODE = pcdata.LINE_CODE,
                PROCESS_NAME = pcdata.PROCESS_NAME,
                PING_STATUS = pcdata.PING_STATUS,
                SFC_STATUS = pcdata.SFC_STATUS,
                FL_STATUS = pcdata.FL_STATUS,
                RAS_STATUS = pcdata.RAS_STATUS,
                PC_UTC = pcdata.PC_UTC,
                PC_PROCESSOR_STATUS = pcdata.PC_PROCESSOR_STATUS,
                PC_RAM_STATUS = pcdata.PC_RAM_STATUS,
                PC_VERSION = pcdata.PC_VERSION,
                IPADDRESS = pcdata.IPADDRESS,
            });
        }
        return View(PCList);
    }

你能告诉我是什么导致了错误或我做错了什么吗?提前致谢

编辑:

添加 Oracle 表语法

    -- Create table
create table TB_OP_PC_MONITORING_V4
(
  idpc                NUMBER not null,
  ipaddress           VARCHAR2(20) not null,
  pc_name             VARCHAR2(30) not null,
  pc_mac              VARCHAR2(20),
  pc_model            VARCHAR2(30),
  pc_sn               VARCHAR2(30),
  pc_mfg              VARCHAR2(30),
  pc_processor        VARCHAR2(70),
  pc_speed            VARCHAR2(15),
  pc_ram              VARCHAR2(8),
  pc_core             VARCHAR2(2),
  pc_username         VARCHAR2(50),
  pc_version          VARCHAR2(50),
  pc_servicepack      VARCHAR2(8),
  pc_arch             VARCHAR2(8),
  pc_serialkey        VARCHAR2(30),
  pc_reg_user         VARCHAR2(100),
  pc_install_date     VARCHAR2(18),
  line_code           VARCHAR2(20),
  process_name        VARCHAR2(60),
  order_rate          NUMBER,
  machine_type        VARCHAR2(10),
  create_date         DATE,
  sfc_status          VARCHAR2(2),
  update_sfc          DATE,
  sys_update_sfc      DATE,
  time_out_sfc        NUMBER,
  fl_status           VARCHAR2(2),
  update_fl           DATE,
  sys_update_fl       DATE,
  time_out_fl         NUMBER,
  ping_status         VARCHAR2(2),
  update_ping         DATE,
  sys_update_ping     DATE,
  time_out_ping       NUMBER,
  raws                VARCHAR2(2),
  pc_processor_status VARCHAR2(3),
  pc_ram_status       VARCHAR2(3),
  pc_utc              VARCHAR2(15),
  ras_status          VARCHAR2(2),
  update_ras          DATE,
  sys_update_ras      DATE,
  time_out_ras        NUMBER
)
tablespace TS_DATA
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 1M
    minextents 1
    maxextents unlimited
  );

和问题: 在此处输入图像描述

编辑2:

EntityFramework Table TB_OP_PC_MONITORING_V4在我创建Model.edmx 时生成

  namespace MVC_PCMonitoring_Dash
    {
        using System;
        using System.Collections.Generic;
        
        public partial class TB_OP_PC_MONITORING_V4
        {
            public decimal IDPC { get; set; }
            public string IPADDRESS { get; set; }
            public string PC_NAME { get; set; }
            public string PC_MAC { get; set; }
            public string PC_MODEL { get; set; }
            public string PC_SN { get; set; }
            public string PC_MFG { get; set; }
            public string PC_PROCESSOR { get; set; }
            public string PC_SPEED { get; set; }
            public string PC_RAM { get; set; }
            public string PC_CORE { get; set; }
            public string PC_USERNAME { get; set; }
            public string PC_VERSION { get; set; }
            public string PC_SERVICEPACK { get; set; }
            public string PC_ARCH { get; set; }
            public string PC_SERIALKEY { get; set; }
            public string PC_REG_USER { get; set; }
            public string PC_INSTALL_DATE { get; set; }
            public string LINE_CODE { get; set; }
            public string PROCESS_NAME { get; set; }
            public Nullable<decimal> ORDER_RATE { get; set; }
            public string MACHINE_TYPE { get; set; }
            public Nullable<System.DateTime> CREATE_DATE { get; set; }
            public string SFC_STATUS { get; set; }
            public Nullable<System.DateTime> UPDATE_SFC { get; set; }
            public Nullable<System.DateTime> SYS_UPDATE_SFC { get; set; }
            public Nullable<decimal> TIME_OUT_SFC { get; set; }
            public string FL_STATUS { get; set; }
            public Nullable<System.DateTime> UPDATE_FL { get; set; }
            public Nullable<System.DateTime> SYS_UPDATE_FL { get; set; }
            public Nullable<decimal> TIME_OUT_FL { get; set; }
            public string PING_STATUS { get; set; }
            public Nullable<System.DateTime> UPDATE_PING { get; set; }
            public Nullable<System.DateTime> SYS_UPDATE_PING { get; set; }
            public Nullable<decimal> TIME_OUT_PING { get; set; }
            public string RAWS { get; set; }
            public string PC_PROCESSOR_STATUS { get; set; }
            public string PC_RAM_STATUS { get; set; }
            public string PC_UTC { get; set; }
            public string RAS_STATUS { get; set; }
            public Nullable<System.DateTime> UPDATE_RAS { get; set; }
            public Nullable<System.DateTime> SYS_UPDATE_RAS { get; set; }
            public Nullable<decimal> TIME_OUT_RAS { get; set; }
        }
    }

模型1.上下文

namespace MVC_PCMonitoring_Dash
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    
    public partial class Entities : DbContext
    {
        public Entities()
            : base("name=Entities")
        {
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
    
        public DbSet<TB_TEST> TB_TEST { get; set; }
        public DbSet<TB_OP_PC_MONITORING_V4> TB_OP_PC_MONITORING_V4 { get; set; }
    }
}

编辑3:

根据结果​​更新字段的 Oracle 过程

create or replace procedure SP_DASHBOARD_PINGSTATUS is
begin
  declare

  BEGIN
       Update rsmes.tb_op_pc_monitoring_v4 t
        set t.sys_update_ping = sysdate,
            t.sys_update_sfc = sysdate,
            t.sys_update_fl = sysdate,
            t.sys_update_ras = sysdate,
            t.pc_utc = (select 'UTC' || substr(current_timestamp, '30','6')timezonenumber from dual);
   for c in (select ipaddress,((SYS_UPDATE_PING - UPDATE_PING)*60*60*24) as PING_RESULT from TB_OP_PC_MONITORING_V4)
     loop
        Update rsmes.tb_op_pc_monitoring_v4 tg
         set tg.ping_status =
                case
                  when (SYSDATE - tg.update_ping) * 60 * 60 * 24 <= 5 then 'OK'
                  else 'NG'
                end,
                tg.time_out_ping = (SYSDATE - tg.update_ping) * 60 * 60 * 24;
       end loop;
   for d in (select ipaddress,((SYS_UPDATE_SFC - UPDATE_SFC)*60*60*24) as SFC_RESULT from TB_OP_PC_MONITORING_V4)
     loop
        Update rsmes.tb_op_pc_monitoring_v4 tg2
         set tg2.sfc_status =
                case
                  when (SYSDATE - tg2.update_sfc) * 60 * 60 * 24 <= 5 then 'OK'
                  else 'NG'
                end,
                tg2.time_out_sfc = (SYSDATE - tg2.update_sfc) * 60 * 60 * 24;
       end loop;
   for e in (select ipaddress,((SYS_UPDATE_FL - UPDATE_FL)*60*60*24) as FL_RESULT from TB_OP_PC_MONITORING_V4)
     loop
        Update rsmes.tb_op_pc_monitoring_v4 tg3
         set tg3.fl_status =
                case
                  when (SYSDATE - tg3.update_fl) * 60 * 60 * 24 <= 5 then 'OK'
                  else 'NG'
                end,
                tg3.time_out_fl = (SYSDATE - tg3.update_fl) * 60 * 60 * 24;
       end loop;
   for f in (select ipaddress,((SYS_UPDATE_RAS - UPDATE_RAS)*60*60*24) as RAS_RESULT from TB_OP_PC_MONITORING_V4)
     loop
        Update rsmes.tb_op_pc_monitoring_v4 tg3
         set tg3.ras_status =
                case
                  when (SYSDATE - tg3.update_ras) * 60 * 60 * 24 <= 5 then 'OK'
                  else 'NG'
                end,
                tg3.time_out_ras = (SYSDATE - tg3.update_ras) * 60 * 60 * 24;
       end loop;
        commit;
  END;
end SP_DASHBOARD_PINGSTATUS;

标签: c#oracleentity-framework

解决方案


推荐阅读