C#读取MSSQL数据时固定赋值次数后抛出System.InvalidCastException异常
问题排查与解决方案
核心原因定位
你遇到的固定次数赋值必抛异常、与赋值内容无关的现象,90%以上的概率来自自定义实体类的属性写法错误:属性set访问器出现无限递归调用。
排查步骤
- 检查你用来接收数据库数据的自定义类的所有属性写法
- 错误写法示例(会触发无限递归):
这种写法会在每次给属性赋值时反复调用set访问器,直到栈内存溢出触发异常。而栈溢出的触发时机对应固定的递归调用次数,所以会出现无论赋值什么内容、调整赋值顺序,都是固定第N次赋值必崩的现象。public string UserName { get => UserName; set => UserName = value; }- 正确写法参考:
// 写法1:直接用自动属性 public string UserName { get; set; } // 写法2:带私有字段的属性定义 private string _userName; public string UserName { get => _userName; set => _userName = value; } - 如果属性写法无异常,排查DataReader读取逻辑
- 确认每次读取新行前都正确调用了
reader.Read()方法,且判断返回值为true才进行字段读取操作 - 不要在循环外缓存字段索引,避免索引值溢出当前查询的字段总数
- 确认每次读取新行前都正确调用了
- 若以上两点都正常,检查数据库连接字符串的超时设置,确认读取过程中连接没有被意外释放
验证方法
你可以先写一个简化测试用例:直接实例化你的自定义类,连续给它的属性赋值10次以上,如果同样在第5次左右抛出异常,就可以100%确认是属性递归的问题。
内容的提问来源于stack exchange,提问作者Jona Sanderson
相关产品推荐
相关产品推荐

