将DataTable转换为List<T>对象遇到问题:类型“System.Int64”的对象无法转换为类型“System.Int32”
来源:互联网 发布:网络阅卷答题卡 编辑:程序博客网 时间:2024/03/28 18:38
前言:
用三层开发的时候,D层经常会用到把DataTable对象转换为List对象的问题,一般情况下我们都会用到一个TableToList()方法,之前都是照着网上敲得,完了大致看一下就开始用了,也没出什么问题,也就没有仔细研究,这次用这个方法转换的时候遇到了一个异常(如题),出来混迟早要还的,这次让我重新研究了一下这个方法。
方法思路:
简单了解一下TableToList()方法的思路。
1. 初始化一个List对象,获取到T所有的属性,
2. 初始化一个T对象 遍历所有属性,
3. 如果DataTable中含有相应属性的值则为T对象赋值,如果没有对应的列则检查数据模型是否定义有误(属性名与列名比较时不区分大小写)
4. 将T对象添加到List对象中
遇到的问题
我也是很奇怪,我的plan_flag字段在前边明明传进去的就是int32的,到这里怎么成了int64不能转换成int32位了。
根据之前的思路和异常出现的地方,问题出在给对象的属性赋值这步。
因为转换时在DataTable里某个字段类型是Int32会有问题,报异常,所以我们可在赋值的时候加一个判断:
//加一重if判断,如果属性值是int32类型的,就进行一次强制转换if(pi.GetMethod.ReturnParameter.ParameterType.Name == "Int32"){value = Convert.ToInt32(value);}pi.SetValue(t, value, null);
完整的方法
/// <summary> /// DataTable转换为List /// </summary> /// <typeparam name="T">实体对象</typeparam> /// <param name="dt">datatable表</param> /// <returns>返回list集合</returns> public List<T> TableToList<T>(DataTable dt) where T : new() { //定义集合 List<T> list = new List<T>(); //获得此模型的类型 Type type = typeof(T); //定义一个临时变量 string tempName = string.Empty; //遍历Datatable中所有的数据行 foreach (DataRow dr in dt.Rows) { T t = new T(); //获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); //遍历该对象的所有属性 foreach (PropertyInfo pi in propertys) { //将属性名称赋值给临时变量 tempName = pi.Name; //检查DataTable是否包含此列(列名==对象的属性名) if (dt.Columns.Contains(tempName)) { //判断此属性是否有Setter if (!pi.CanWrite) continue;//该属性不可写,直接跳出 //取值 object value = dr[tempName]; //如果非空,则赋给对象的属性 if (value != DBNull.Value) { //加一重if判断,如果属性值是int32类型的,就进行一次强制转换 if(pi.GetMethod.ReturnParameter .ParameterType.Name=="Int32") { value = Convert.ToInt32(value); } pi.SetValue(t, value, null); } } } //对象添加到泛型集合中 list.Add(t); } return list; }
总结
还是多一点了解比较好,知其然也要之前所以然,要不然出问题的时候找不到问题原因,更找不到解决方法。
阅读全文
0 0
- 将DataTable转换为List<T>对象遇到问题:类型“System.Int64”的对象无法转换为类型“System.Int32”
- 无法将类型为“System.Int32”的对象强制转换为类型“System.String”
- 关于MVC中无法将类型为“System.Int32”的对象强制转换为类型“System.String”的问题。
- Linq集合查询出现无法将类型为“System.Int32”的对象强制转换为类型“System.String”异常
- ASP.NET.MVC异常--无法将类型为System.Int32的对象强制转换为类型System.String
- C# 类型“System.String”的对象无法转换为类型“System.Int32”
- 无法将类型为“System.Xml.XmlComment”的对象强制转换为类型“System.Xml.XmlElement”。
- 错误:无法将类型为“System.DBNull”的对象强制转换为类型“System.Byte[]”。
- 无法将类型为“System.Web.UI.LiteralControl”的对象强制转换为类型“System.Web
- 无法将类型为“System.DBNull”的对象强制转换为类型“System.Byte[]”
- C# 无法将类型为“System.DBNull”的对象强制转换为类型“System.String”。
- 无法将类型为“System.__ComObject”的 COM 对象强制转换为类类型“mshtml.HTMLInputElementClass
- 解决“无法将System.Byte[]的对象强制转换为类型System.IConvertible”的错误
- Repeater嵌套无法将类型为“System.Data.DataRow”的对象强制转换为类型“System.Data.DataRowView
- 无法将类型为“System.Web.UI.LiteralControl”的对象强制转换为类型“System.Web.UI.WebControls.TextBox
- 无法将类型为“System.DBNull”的对象强制转换为类型“System.String”分析及解决方案
- 无法将类型为“System.Web.UI.LiteralControl”的对象强制转换为类型“System.Web.UI.WebControls.Text
- 【Winform】 无法将类型为“System.Windows.Forms.SplitContainer”的对象强制转换为类型“System.ComponentModel.ISupportInitialize”。
- Levenshtein 距离(字符串距离)
- Linux信号处理机制
- bzoj 4260: Codechef REBXOR
- 欢迎使用CSDN-markdown编辑器
- hihocoder165-枚举&贪心-分隔相同字符
- 将DataTable转换为List<T>对象遇到问题:类型“System.Int64”的对象无法转换为类型“System.Int32”
- RecyclerView 基本用法及另类加分割线技巧
- Problem J. Jumbled Compass---Urozero Autumn Training Camp 2016-Day 1||签到&模拟时针转动
- 混合背包——洛谷P1833 樱花
- 算法<删除一个数组中为0的元素>
- 莫队算法 BZOJ 2038 小Z的袜子
- NYOJ 101 两点距离
- 二、SQL语句映射文件(1)resultMap
- (学习笔记)设计模式之桥接模式