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
相关产品推荐
相关产品推荐

