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

探讨了在C#中使用SQLite时,cast(sum(a)asdecimal)导致的数据类型不匹配问题,特别是在a的小数部分为0时,数据被误认为Int64类型。文章提供了解决方案,通过在实体类转换时增加类型检查,确保正确转换。
摘要由CSDN通过智能技术生成

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         }

 

posted on 2017-05-17 23:06  zzhaoh 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/zhaohz/p/6870039.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值