首页 新闻 会员 周边

导入excel动态的生成sql语句

0
悬赏园豆:10 [待解决问题]

我是要用excel转换为datatable,用datatable的header与实体类比较,

private static IList<T> GetSql<T>(List<DataColumn> l) where T : new()
{
Type t = typeof(T);
PropertyInfo[] p = t.GetProperties();
StringBuilder sb = new StringBuilder();
foreach (DataColumn dc in l)
{
foreach (PropertyInfo item in p)
{
if(dc.)
}
}
}这样写也不知道对不对,,写不出啊来了。

灬丶的主页 灬丶 | 初学一级 | 园豆:2
提问于:2016-09-08 09:14
< >
分享
所有回答(4)
0

没看明白问题,T是什么?

Daniel Cai | 园豆:10424 (专家六级) | 2016-09-08 09:22

 GetSql<HZ.DrugTrade.Model.ProcureCatalog>(list);传过去的,也不知道对不对。

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2016-09-08 09:24

@灬丶: 你的意思是你现在有个datatable,然后你想把第一行的数据转为一个实体返回出去?

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-09-08 09:29

@Daniel Cai: 是这样的,导入excel数据是通过insert的语句实现的,但是这样写死了,如果excel要增加几列,就不行了。所以想动态的生成sql语句

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2016-09-08 09:32

@灬丶: excel增加的几列是从哪里拿到的?是T的属性列表还是你的datacolumn的那个方法参数?

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-09-08 09:37

@Daniel Cai: 不是啊,就是导入时如果别人要多导入几列数据,那么datacolumn肯定也要变啊,但是T是实体类,里面的属性都是固定的。

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2016-09-08 09:40

@灬丶: 你的意思是根据datacolumn那个参数确定新增的字段,然后通过某种方式读取到这些column对应的值,最后赋给T的实例?

如果是这样,这个column的值从哪里读?

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-09-08 09:46

@Daniel Cai: 从excel啊,通过方法读取到excel把他转换为datatable,反正是这样写的,不知道对不对,呵呵

  List<DataColumn> list = new List<DataColumn>();

。。

for (int i = headerRow.FirstCellNum; i < cellCount; i++)
{
DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
dt.Columns.Add(column);
list.Add(column);
}

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2016-09-08 09:49

@灬丶: 你直接用odbc去连excel文件,然后select后不就是个dataset或者datareader了么?为什么还要这样绕弯弯?

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-09-08 09:52

@Daniel Cai: 呵呵,没用过odbc,。。。。

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2016-09-08 10:03

@灬丶: 只是驱动不一样(连接串),其他基本都一样的,何必一个cell一个cell的读呢

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-09-08 10:22

@Daniel Cai: 感觉反射这种东西对我这种渣渣好难理解

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2016-09-08 10:43

@灬丶: 你最好画一个树状图,从type画下来,然后下面memberinfo的几个派生类,这样学反射会简单些的。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-09-08 10:57
0

转换为datatable你返回IList<T>干啥?

顾晓北 | 园豆:10844 (专家六级) | 2016-09-08 09:23

GetSql<HZ.DrugTrade.Model.ProcureCatalog>(list)

只是想把datatable的header放进去,不知道是不是这样写的

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2016-09-08 09:25
0

这个应该是你想要的 就是用DataROW去填充实体。找到匹配的属性就赋值 没有则赋默认值

 1 /// <summary>
 2         /// 装填实体
 3         /// </summary>
 4         /// <typeparam name="T"></typeparam>
 5         /// <param name="dr"></param>
 6         /// <returns></returns>
 7         public static T FilledModel<T>(DataRow dr) where T : new() {
 8             var model = default(T);
 9             try
10             {
11                 model = new T();
12                 var arrPropertyInfo = model.GetType().GetProperties();
13                 var columnName = string.Empty;
14 
15                 Array.ForEach(arrPropertyInfo, propertyInfo =>
16                 {
17                     Type type = propertyInfo.GetType();
18                     columnName = propertyInfo.Name;
19                     var val = propertyInfo.GetValue(propertyInfo, null);//获取类型默认值
20                     if (dr.Table.Columns.Contains(columnName) && dr[columnName] != DBNull.Value)//确认dr包含字段及值
21                     {
22                         try
23                         {
24                             propertyInfo.SetValue(model, Convert.ChangeType(dr[columnName], type), null);
25                         }
26                         catch
27                         {
28                             propertyInfo.SetValue(model, val, null);
29                         }
30                     }
31                     else {
32                         propertyInfo.SetValue(model, val, null);
33                     }
34                 });
35             }
36             catch { }
37 
38            return model;
39         }
40     }

 

alci | 园豆:233 (菜鸟二级) | 2016-09-08 10:15

感激,我来仔细看看

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2016-09-08 10:18

@灬丶: 列表就用这个

1 public static List<T> FilledModels<T>(IEnumerable<DataRow> drs) where T : new()
2         {
3             var list = drs.Select(FilledModel<T>).ToList();
4             return list;
5         }

但是反射肯定效率不会太高。Emit方式效率会更高

支持(0) 反对(0) alci | 园豆:233 (菜鸟二级) | 2016-09-08 10:21

@alci: 恩恩,我试试

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2016-09-08 10:22

@灬丶: 感觉反射这种东西对我这种渣渣好难理解

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2016-09-08 10:42
0

嘿嘿,DataTable.ToList<T>()就解决了呀,没有这么复杂

名字什么都是浮云 | 园豆:327 (菜鸟二级) | 2016-09-14 17:52

就想象excel就是个Table,然后ToList就ok了

支持(0) 反对(0) 名字什么都是浮云 | 园豆:327 (菜鸟二级) | 2016-09-14 17:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册