sqlite使用cast(sum(a) as decimal),如果a小数部分都是0,那么填充到Table时,Table中字段会被认作System.Int64类型。
C# 中DataTable转实体类的时候就会报错,"类型“System.Int64”的对象无法转换为类型“System.Decimal”。
实体类转换函数原代码如下:
1 /// <summary> 2 /// 填充对象列表:用DataTable填充实体类 3 /// </summary> 4 public List<T> FillModel(DataTable dt) 5 { 6 if (dt == null || dt.Rows.Count == 0) 7 { 8 return null; 9 } 10 try 11 { 12 List<T> modelList = new List<T>(); 13 foreach (DataRow dr in dt.Rows) 14 { 15 //T model = (T)Activator.CreateInstance(typeof(T)); 16 T model = new T(); 17 for (int i = 0; i < dr.Table.Columns.Count; i++) 18 { 19 PropertyInfo propertyInfo = model.GetType().GetProperty(dr.Table.Columns[i].ColumnName); 20 if (propertyInfo != null && dr[i] != DBNull.Value) 21 { 22 propertyInfo.SetValue(model, dr[i], null); 23 } 24 } 25 26 modelList.Add(model); 27 } 28 return modelList; 29 } 30 catch (Exception ex) { throw ex; } 31 finally 32 { 33 } 34 }
解决办法,转换的时候先做判断,如果不是预设类型,则根据实际类型创建新的对象,间接赋值,修改好的代码如下(29,30行):
1 /// <summary> 2 /// 填充对象列表:用DataTable填充实体类 3 /// </summary> 4 public List<T> FillModel(DataTable dt) 5 { 6 if (dt == null || dt.Rows.Count == 0) 7 { 8 return null; 9 } 10 try 11 { 12 List<T> modelList = new List<T>(); 13 foreach (DataRow dr in dt.Rows) 14 { 15 //T model = (T)Activator.CreateInstance(typeof(T)); 16 T model = new T(); 17 for (int i = 0; i < dr.Table.Columns.Count; i++) 18 { 19 PropertyInfo propertyInfo = model.GetType().GetProperty(dr.Table.Columns[i].ColumnName); 20 if (propertyInfo != null && dr[i] != DBNull.Value) 21 { 22 if (propertyInfo.PropertyType.FullName == dr[i].GetType().FullName) 23 { 24 propertyInfo.SetValue(model, dr[i], null); 25 } 26 else 27 { 28 //如果Table中的数据类型和自定义Entity类中的数据类型不一样,以ntity类中的为准 29 object a = Activator.CreateInstance(Type.GetType(propertyInfo.PropertyType.FullName), dr[i]); 30 propertyInfo.SetValue(model, a, null); 31 } 32 } 33 } 34 modelList.Add(model); 35 } 36 return modelList; 37 } 38 catch (Exception ex) { throw ex; } 39 finally 40 { 41 } 42 }