使用ADO.NET取数到KendoGrid时遇Int32转String类型转换异常
解决“Unable to cast object of type 'System.Int32' to type 'System.String'”异常
从你提供的代码来看,这个类型转换异常大概率是数据库字段类型与C#代码中读取/赋值的类型不匹配导致的,结合你的场景,我整理了几个排查和解决方向:
1. 先定位异常的具体字段
你当前的异常处理过于宽泛(空的catch块),建议先修改数据库层的异常捕获逻辑,记录详细的异常信息:
catch (Exception ex) { // 可以写入日志或者输出调试信息,比如Console.WriteLine(ex.ToString()); // 这样能直接看到异常发生在哪个字段的读取操作上 operationStatus = GeneralDAL.OperationStatus.OperationFailed; }
这样调试时就能精准定位到引发转换错误的字段,不用盲目排查。
2. 检查ID_Timeline_bulk字段的类型匹配
你代码中读取ID_Timeline_bulk的逻辑是:
ID_Timeline_bulk = sqlDataReader.IsDBNull(sqlDataReader.GetOrdinal(Timeline.Fildes.ID_Timeline_bulk)) ? General.DefaultValues.Numricguid : sqlDataReader.GetGuid(sqlDataReader.GetOrdinal(Timeline.Fildes.ID_Timeline_bulk)),
如果数据库中ID_Timeline_bulk字段的类型是INT(整数),而不是UniqueIdentifier(GUID),那么调用GetGuid()会直接抛出类型转换异常——因为数据库返回的是Int32对象,无法强制转换成Guid类型。
对应解决方案:
- 如果数据库字段确实是INT:修改代码为读取整数,并确保
Timeline类的ID_Timeline_bulk属性类型为int:ID_Timeline_bulk = sqlDataReader.IsDBNull(sqlDataReader.GetOrdinal(Timeline.Fildes.ID_Timeline_bulk)) ? 0 // 或者你需要的默认整数值 : sqlDataReader.GetInt32(sqlDataReader.GetOrdinal(Timeline.Fildes.ID_Timeline_bulk)), - 如果数据库字段应该是GUID:确认数据库中该字段的类型是UniqueIdentifier,并且插入数据时确实存储的是合法的GUID值。
3. 排查注释掉的其他字段
你代码中注释了“其他字段”,这些字段也可能存在类型不匹配的问题:
- 比如,若某个
string类型的属性,你直接用sqlDataReader.GetString()读取数据库中的INT字段,就会抛出“Int32转String”的异常; - 反过来,如果是
int类型的属性,却读取了数据库中的字符串字段,也会引发类似错误。
对应解决方案:
逐个核对每个字段:
- 查看数据库表中对应字段的类型(如INT、VARCHAR、DATE等);
- 确保
Timeline类的属性类型与数据库字段类型兼容; - 使用对应的
SqlDataReader读取方法:比如INT用GetInt32(),字符串用GetString(),日期用GetDateTime()等。如果需要转换类型(如把INT转成字符串),显式调用.ToString()方法,不要依赖隐式转换。
4. 检查SQL查询语句的正确性
确认Returnsp_tbl_TimelineLstShow_bulk(id_user)生成的SQL语句返回的字段类型是否符合预期:
- 是否在查询中把INT字段用
CAST/CONVERT转换成了字符串,但代码里却用GetInt32()读取; - 或者查询返回的字段和你预期的字段不匹配(比如别名写错,导致读取了错误的字段)。
小技巧:
调试时可以把生成的SQL语句复制到数据库管理工具(如SSMS)中执行,查看返回的每个字段的实际类型,再和代码中的读取逻辑对比。
内容的提问来源于stack exchange,提问作者hamed hassani
相关产品推荐
相关产品推荐

