首页 > 代码库 > C# sqlite在使用cast(sum(a) as decimal) 时认作int型的问题处理

C# sqlite在使用cast(sum(a) as decimal) 时认作int型的问题处理

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型的问题处理