You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+ASP.NET读取数据库时单个int字段报System.InvalidCastException

问题描述

基于React与ASP.NET的应用,从SQL数据库读取数据到C#控制器时出现异常:

  • 两个int类型字段中,ErrorLevel可正常读取并在UI及组件中使用;
  • ApplicationID字段触发来自System.Data.Common.dll的System.InvalidCastException,导致网页抛出Unexpected end of JSON Input错误。

已核查信息:

  • SQL表中两个字段均为int、非空类型;
  • 字段名称无拼写错误;
  • 注释其他代码仅保留该字段读取逻辑仍报错。

相关代码:

控制器代码

var myReturn = dt.AsEnumerable().Select(t => new McProcessInfo()
{
    Application = t.Field<string>("Application"),
    ApplicationID = t.Field<int>("ApplicationId"), // 异常触发处
    ApplicationVersion = t.Field<string>("ApplicationVersion"),
    ErrorLevel = t.Field<int>("ErrorLevel"), // 正常读取
    ErrorMessage = t.Field<string>("ExceptionErrorMessage"), 
    StackTrace = t.Field<string>("StackTrace")
}).ToArray();
return myReturn;

实体类代码

public class McProcessInfo
{
  public string Application { get; set; }
  public int ApplicationID { get; set; }
  public string ApplicationVersion { get; set; }
  public int ErrorLevel { get; set; }
  public string ErrorMessage {  get; set; }
  public string StackTrace { get; set; }
}
排查与解决方案
  • 核实数据库字段精确类型:即使标注为int,部分数据库可能存在细分类型(如smallint、bigint),或实际存储的数值超出int范围(int最大值为2147483647)。用数据库管理工具查看字段的具体类型,若为bigint,需将实体类属性改为long,控制器中用Field<long>读取。
  • 检查字段名大小写匹配:部分数据库(如MySQL在区分大小写的环境下)对字段名大小写敏感。确认SQL表中字段名是ApplicationId(小写d)还是ApplicationID(大写D),保持与控制器中Field方法的参数一致。
  • 改用安全转换方式:暂时替换强转为Convert.ToInt32,同时调试查看实际数据类型:
    ApplicationID = Convert.ToInt32(t.Field<object>("ApplicationId")),
    
    若转换成功,说明原强转的类型不匹配;若失败,可在调试中查看t.Field<object>("ApplicationId")的实际值与类型。
  • 检查SQL查询语句:确认查询时未对ApplicationId做类型转换(如CAST(ApplicationId AS varchar)),避免返回非int类型数据。
  • 捕获异常详情:添加try-catch块获取具体错误信息,定位问题根源:
    try
    {
        var myReturn = dt.AsEnumerable().Select(t => new McProcessInfo()
        {
            Application = t.Field<string>("Application"),
            ApplicationID = t.Field<int>("ApplicationId"),
            ApplicationVersion = t.Field<string>("ApplicationVersion"),
            ErrorLevel = t.Field<int>("ErrorLevel"),
            ErrorMessage = t.Field<string>("ExceptionErrorMessage"), 
            StackTrace = t.Field<string>("StackTrace")
        }).ToArray();
        return myReturn;
    }
    catch (InvalidCastException ex)
    {
        // 输出ex.Message及ex.InnerException到日志或调试窗口
        throw;
    }
    

内容的提问来源于stack exchange,提问作者webstergem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:28:12