C# sqlite在使用cast(sum(a) as decimal) 時認作int型的問題處理
阿新 • • 發佈:2017-05-18
new clas span eof tro exce datarow foreach val
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 }
C# sqlite在使用cast(sum(a) as decimal) 時認作int型的問題處理