1. 程式人生 > >C# sqlite在使用cast(sum(a) as decimal) 時認作int型的問題處理

C# sqlite在使用cast(sum(a) as decimal) 時認作int型的問題處理

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型的問題處理