DataToModel.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Reflection;
  6. using System.Data;
  7. using ETD.Log;
  8. using ETD.Frame;
  9. namespace ETD.Frame
  10. {
  11. public static class DataToModel
  12. {
  13. private static Dictionary<string, EntityValue> vl = null;
  14. #region 将DataTable转换成List列表
  15. #region 返回一条实体数据
  16. /// <summary>
  17. /// DataReader转实体
  18. /// </summary>
  19. /// <typeparam name="T"></typeparam>
  20. /// <param name="rdr"></param>
  21. /// <returns></returns>
  22. public static T Dr2En<T>(IDataReader rdr)
  23. {
  24. DataTable dtt = Dr2Dt(rdr);
  25. return Dt2En<T>(dtt); ;
  26. }
  27. /// <summary>
  28. /// DataReader转Object
  29. /// </summary>
  30. /// <param name="rdr"></param>
  31. /// <param name="entity"></param>
  32. /// <returns></returns>
  33. public static object Dr2EnObj(IDataReader rdr, object entity)
  34. {
  35. DataTable dtt = Dr2Dt(rdr);
  36. return Dt2EnObj(dtt, entity);
  37. }
  38. /// <summary>
  39. /// 返回一条实体数据
  40. /// </summary>
  41. /// <typeparam name="T">实体</typeparam>
  42. /// <param name="dataTable">表数据</param>
  43. /// <returns></returns>
  44. public static T Dt2En<T>(DataTable dataTable)
  45. {
  46. Dictionary<string, EntityValue> vl = new Dictionary<string, EntityValue>();
  47. T obj = Activator.CreateInstance<T>();
  48. if (dataTable.Rows.Count > 0)
  49. {
  50. DataRow row = dataTable.Rows[0];
  51. obj = (T)DtSetValueField(row, obj);
  52. }
  53. return obj;
  54. }
  55. /// <summary>
  56. /// 返回一条实体数据
  57. /// </summary>
  58. /// <typeparam name="T">实体</typeparam>
  59. /// <param name="dataTable">表数据</param>
  60. /// <returns></returns>
  61. private static object Dt2EnObj<T>(DataTable dt)
  62. {
  63. vl = new Dictionary<string, EntityValue>();
  64. T obj = Activator.CreateInstance<T>();
  65. if (dt.Rows.Count > 0)
  66. {
  67. DataRow row = dt.Rows[0];
  68. obj = (T)DtSetValueField(row, obj);
  69. }
  70. return obj;
  71. }
  72. /// <summary>
  73. /// 获取一条实体
  74. /// </summary>
  75. /// <param name="dt"></param>
  76. /// <param name="enty"></param>
  77. /// <returns></returns>
  78. public static object Dt2EnObj(DataTable dt, object enty)
  79. {
  80. object obj = Activator.CreateInstance(enty.GetType());
  81. if (dt == null) return obj;
  82. if (dt.Rows.Count == 0) return obj;
  83. PropertyInfo[] propertys = enty.GetType().GetProperties();
  84. obj = DtSetValueField(dt.Rows[0], obj);
  85. return obj;
  86. }
  87. #endregion
  88. #region 返回实体集合
  89. /// <summary>
  90. /// DataReader转object
  91. /// </summary>
  92. /// <param name="rdr"></param>
  93. /// <param name="entity"></param>
  94. /// <returns></returns>
  95. public static object Dr2EnList(IDataReader rdr, object entity)
  96. {
  97. DataTable dtt = Dr2Dt(rdr);
  98. return Dt2EnList(dtt, entity);
  99. }
  100. /// <summary>
  101. /// DataReader转实体集合
  102. /// </summary>
  103. /// <typeparam name="T"></typeparam>
  104. /// <param name="rdr"></param>
  105. /// <returns></returns>
  106. public static List<T> Dr2EnList<T>(IDataReader rdr)
  107. {
  108. DataTable dtt = Dr2Dt(rdr);
  109. List<T> listobj = Dt2EnList<T>(dtt);
  110. return listobj;
  111. }
  112. /// <summary>
  113. /// 将DataTable转换为list(用的FOR赋值,效果一样,这种比较复杂)
  114. /// </summary>
  115. /// <typeparam name="T"></typeparam>
  116. /// <param name="dt"></param>
  117. /// <returns></returns>
  118. public static List<T> Dt2EnList<T>(DataTable dt)
  119. {
  120. List<T> list = new List<T>();
  121. if (dt == null) return list;
  122. foreach (DataRow row in dt.Rows)
  123. {
  124. T obj = Activator.CreateInstance<T>();
  125. obj = (T)DtSetValueField(row, obj);
  126. list.Add(obj);
  127. }
  128. return list;
  129. }
  130. /// <summary>
  131. /// DataTable转换成实体列表
  132. /// </summary>
  133. /// <typeparam name="T">实体 T </typeparam>
  134. /// <param name="table">datatable</param>
  135. /// <returns></returns>
  136. public static IList<T> DataTableToList<T>(DataTable table)
  137. where T : class
  138. {
  139. if (!IsHaveRows(table))
  140. return new List<T>();
  141. IList<T> list = new List<T>();
  142. T model = default(T);
  143. foreach (DataRow dr in table.Rows)
  144. {
  145. model = Activator.CreateInstance<T>();
  146. foreach (DataColumn dc in dr.Table.Columns)
  147. {
  148. object drValue = dr[dc.ColumnName];
  149. PropertyInfo pi = model.GetType().GetProperty(dc.ColumnName);
  150. if (pi != null && pi.CanWrite && (drValue != null && !Convert.IsDBNull(drValue)))
  151. {
  152. pi.SetValue(model, drValue, null);
  153. }
  154. }
  155. list.Add(model);
  156. }
  157. return list;
  158. }
  159. /// <summary>
  160. /// 将表数据转换成实体集合
  161. /// </summary>
  162. /// <param name="dataTable">表数据</param>
  163. /// <param name="enty">实体</param>
  164. /// <returns></returns>
  165. public static object Dt2EnList(DataTable dt, object enty)
  166. {
  167. List<object> list = new List<object>();
  168. if (dt == null) return list;
  169. foreach (DataRow row in dt.Rows)
  170. {
  171. object obj = Activator.CreateInstance(enty.GetType());
  172. obj = DtSetValueField(row, obj);
  173. list.Add(obj);
  174. }
  175. return list;
  176. }
  177. #endregion
  178. #region 公共调用用DataRow给实体进行赋值
  179. /// <summary>
  180. /// 给实体进行赋值
  181. /// </summary>
  182. /// <param name="row"></param>
  183. /// <param name="objj"></param>
  184. /// <returns></returns>
  185. private static object DtSetValueField(DataRow row, object objj)
  186. {
  187. Dictionary<string, EntityValue> vl = new Dictionary<string, EntityValue>();
  188. foreach (PropertyInfo pinfo in objj.GetType().GetProperties())
  189. {
  190. DataFieldColumnAttribute dfa = Attribute.GetCustomAttribute(pinfo, typeof(DataFieldColumnAttribute)) as DataFieldColumnAttribute;
  191. if (!object.Equals(dfa, null))
  192. {
  193. try
  194. {
  195. if (!Convert.IsDBNull(row[pinfo.Name]))
  196. {
  197. vl = SetChanaged(pinfo.Name, row[pinfo.Name], vl);
  198. if (pinfo.PropertyType.ToString().ToLower().Contains("system.int64"))
  199. pinfo.SetValue(objj, Convert.ToInt64(row[pinfo.Name]), null);
  200. else if (pinfo.PropertyType.ToString().ToLower().Contains("system.int32"))
  201. pinfo.SetValue(objj, Convert.ToInt32(row[pinfo.Name]), null);
  202. else
  203. pinfo.SetValue(objj, row[pinfo.Name], null);
  204. }
  205. else
  206. pinfo.SetValue(objj, null, null);
  207. }
  208. catch (Exception ex)
  209. {
  210. pinfo.SetValue(objj, null, null);
  211. log.WriteException(ex);
  212. }
  213. }
  214. if (pinfo.Name.Contains("PersistType"))
  215. pinfo.SetValue(objj, EntityPersistType.Update, null);
  216. if (pinfo.Name.Contains("Values"))
  217. pinfo.SetValue(objj, vl, null);
  218. }
  219. return objj;
  220. }
  221. /// <summary>
  222. /// 检查DataTable 是否有数据行
  223. /// </summary>
  224. /// <param name="dt">DataTable</param>
  225. /// <returns></returns>
  226. public static bool IsHaveRows(DataTable dt)
  227. {
  228. if (dt != null && dt.Rows.Count > 0)
  229. return true;
  230. return false;
  231. }
  232. /// <summary>
  233. /// DataReader转DataTable
  234. /// </summary>
  235. /// <param name="rdr"></param>
  236. /// <returns></returns>
  237. private static DataTable Dr2Dt(IDataReader rdr)
  238. {
  239. DataTable dtReturn = new DataTable();
  240. DataColumn dc = null;
  241. DataRow dr = null;
  242. for (int i = 0; i < rdr.GetSchemaTable().Rows.Count; i++)
  243. {
  244. dr = rdr.GetSchemaTable().Rows[i];
  245. dc = new DataColumn(dr["ColumnName"].ToString(), dr["DataType"] as Type);
  246. dtReturn.Columns.Add(dc);
  247. }
  248. dr = null; dc = null;
  249. object[] value = new object[rdr.FieldCount];
  250. while (rdr.Read())
  251. {
  252. rdr.GetValues(value);
  253. dtReturn.LoadDataRow(value, true);
  254. }
  255. value = null;
  256. return dtReturn;
  257. }
  258. #endregion
  259. #endregion
  260. #region 备份
  261. ///// <summary>
  262. ///// 将DataTable转换为list(用的FOR赋值,效果一样,这种比较复杂)
  263. ///// </summary>
  264. ///// <typeparam name="T"></typeparam>
  265. ///// <param name="dt"></param>
  266. ///// <returns></returns>
  267. //public static T DataReader2Mod<T>(IDataReader dr)
  268. //{
  269. // T objj = (T)Activator.CreateInstance(typeof(T));
  270. // if (dr == null) return objj;
  271. // PropertyInfo[] propertys = objj.GetType().GetProperties();
  272. // foreach (PropertyInfo pi in propertys)
  273. // {
  274. // //DataTable MyDataTable = dr.GetSchemaTable();
  275. // //foreach (DataRow row in MyDataTable.Rows)
  276. // //{
  277. // // foreach (DataColumn col in MyDataTable.Columns)
  278. // // {
  279. // #region 属性与字段名称一致的进行赋值
  280. // // if (pi.Name.ToLower().Equals(row[0].ToString().ToLower()))
  281. // // {
  282. // // try
  283. // // {
  284. // // if (!Convert.IsDBNull(dr[row[0].ToString()]))
  285. // // {
  286. // // if (pi.PropertyType.ToString().ToLower().Contains("system.int64"))
  287. // // {
  288. // // pi.SetValue(obj, Convert.ToInt64(dr[pi.Name]), null);
  289. // // }
  290. // // if (pi.PropertyType.ToString().ToLower().Contains("system.int32"))
  291. // // {
  292. // // pi.SetValue(obj, dr[pi.Name].ToInt32(), null);
  293. // // }
  294. // // else
  295. // // {
  296. // // pi.SetValue(obj, row[pi.Name], null);
  297. // // }
  298. // // }
  299. // // else
  300. // // pi.SetValue(obj, null, null);//为空,但不为Null
  301. // // }
  302. // // catch (Exception ex)
  303. // // {
  304. // // pi.SetValue(obj, null, null);//为空,但不为Null
  305. // // log.WriteException(ex);
  306. // // }
  307. // // }
  308. // #endregion
  309. // // }
  310. // //}
  311. // for (int k = 0; k < dr.FieldCount; k++)
  312. // {
  313. // if (!DBNull.Value.Equals(dr.GetValue(k)))
  314. // {
  315. // if (pi.PropertyType.ToString().ToLower().Contains("system.int64"))
  316. // pi.SetValue(objj, Convert.ToInt64(dr.GetValue(k)), null);
  317. // else if (pi.PropertyType.ToString().ToLower().Contains("system.int32"))
  318. // pi.SetValue(objj, dr.GetValue(k).ToInt32(), null);
  319. // else
  320. // pi.SetValue(objj, dr.GetValue(k), null);
  321. // }
  322. // }
  323. // if (pi.Name.Contains("PersistType"))
  324. // {
  325. // pi.SetValue(objj, EntityPersistType.Update, null);
  326. // }
  327. // }
  328. // return objj;
  329. //}
  330. ///// <summary>
  331. ///// 这样也可以不过entity每次的值还在,缺点就是无法清除原先的值
  332. ///// </summary>
  333. ///// <param name="dr"></param>
  334. ///// <param name="md"></param>
  335. ///// <param name="enty"></param>
  336. ///// <returns></returns>
  337. //public static object DataReader2Entity(IDataReader dr, object enty)
  338. //{
  339. // object objj = Activator.CreateInstance(enty.GetType());
  340. // if (dr == null) return objj;
  341. // PropertyInfo[] propertys = enty.GetType().GetProperties();
  342. // foreach (PropertyInfo pi in propertys)
  343. // {
  344. // DataTable MyDataTable = dr.GetSchemaTable();
  345. // foreach (DataRow row in MyDataTable.Rows)
  346. // {
  347. // foreach (DataColumn col in MyDataTable.Columns)
  348. // {
  349. // #region 属性与字段名称一致的进行赋值
  350. // if (pi.Name.ToLower().Equals(row[0].ToString().ToLower()))
  351. // {
  352. // try
  353. // {
  354. // if (!Convert.IsDBNull(dr[row[0].ToString()]))
  355. // {
  356. // if (pi.PropertyType.ToString().ToLower().Contains("system.int64"))
  357. // pi.SetValue(objj, Convert.ToInt64(dr[pi.Name]), null);
  358. // else if (pi.PropertyType.ToString().ToLower().Contains("system.int32"))
  359. // pi.SetValue(objj, dr[pi.Name].ToInt32(), null);
  360. // else
  361. // pi.SetValue(objj, row[pi.Name], null);
  362. // }
  363. // else
  364. // pi.SetValue(objj, null, null);//为空,但不为Null
  365. // }
  366. // catch (Exception ex)
  367. // {
  368. // pi.SetValue(objj, null, null);//为空,但不为Null
  369. // log.WriteException(ex);
  370. // }
  371. // }
  372. // #endregion
  373. // }
  374. // if (pi.Name.Contains("PersistType"))
  375. // {
  376. // pi.SetValue(objj, EntityPersistType.Update, null);
  377. // }
  378. // }
  379. // }
  380. // return objj;
  381. //}
  382. ///// <summary>
  383. ///// 将DataTable转换为list(用的FOR赋值,效果一样,这种比较复杂)
  384. ///// </summary>
  385. ///// <typeparam name="T"></typeparam>
  386. ///// <param name="dt"></param>
  387. ///// <returns></returns>
  388. //public static List<T> DataTable2List<T>(DataTable dt)
  389. //{
  390. // List<T> result = new List<T>(); string colname = "";
  391. // MetaData md = MetaDataManager.GetMetaData(typeof(T));
  392. // if (dt == null) return result;
  393. // for (int j = 0; j < dt.Rows.Count; j++)
  394. // {
  395. // T objj = (T)Activator.CreateInstance(typeof(T));
  396. // PropertyInfo[] propertys = objj.GetType().GetProperties();
  397. // foreach (PropertyInfo pi in propertys)
  398. // {
  399. // colname = "";
  400. // for (int i = 0; i < dt.Columns.Count; i++)
  401. // {
  402. // if (pi.Name.ToLower().Equals(dt.Columns[i].ColumnName.ToLower()))
  403. // {
  404. // colname = pi.Name; break;
  405. // }
  406. // }
  407. // if (!string.IsNullOrEmpty(colname))
  408. // {
  409. // #region 属性与字段名称一致的进行赋值
  410. // //if (dt.Rows[j][colname] != DBNull.Value && dt.Rows[j][colname] != null && !object.Equals(dt.Rows[j][colname], null))
  411. // if (!Convert.IsDBNull(dt.Rows[j][colname]))
  412. // {
  413. // try
  414. // {
  415. // pi.SetValue(objj, dt.Rows[j][md.FieldMeteDatas[colname].ColumnName], null);
  416. // }
  417. // catch (Exception ex)
  418. // {
  419. // pi.SetValue(objj, null, null);//为空,但不为Null
  420. // log.WriteException(ex);
  421. // }
  422. // }
  423. // else
  424. // {
  425. // pi.SetValue(objj, null, null);//为空,但不为Null
  426. // }
  427. // #endregion
  428. // }
  429. // if (pi.Name == "PersistType")
  430. // {
  431. // pi.SetValue(objj, EntityPersistType.Update, null);
  432. // }
  433. // }
  434. // result.Add(objj);
  435. // }
  436. // return result;
  437. //}
  438. /// <summary>
  439. /// 暂时不用
  440. /// </summary>
  441. /// <typeparam name="T"></typeparam>
  442. /// <param name="dr"></param>
  443. /// <returns></returns>
  444. //public static object DataTable2List<T>(IDataReader dr)
  445. //{
  446. // T obj = (T)Activator.CreateInstance(typeof(T));
  447. // MetaData md = MetaDataManager.GetMetaData(typeof(T));
  448. // if (dr == null) return obj;
  449. // PropertyInfo[] propertys = obj.GetType().GetProperties();
  450. // foreach (PropertyInfo pi in propertys)
  451. // {
  452. // DataTable MyDataTable = dr.GetSchemaTable();
  453. // foreach (DataRow row in MyDataTable.Rows)
  454. // {
  455. // foreach (DataColumn col in MyDataTable.Columns)
  456. // {
  457. // #region 属性与字段名称一致的进行赋值
  458. // if (pi.Name.ToLower().Equals(row[0].ToString().ToLower()))
  459. // {
  460. // //if (dr[row[0].ToString()] != DBNull.Value)
  461. // //if (dr[row[0].ToString()] != DBNull.Value && dr[row[0].ToString()] != null && !object.Equals(dr[row[0].ToString()], null))
  462. // if (!Convert.IsDBNull(dr[row[0].ToString()]))
  463. // {
  464. // if (pi.PropertyType.ToString().ToLower().Contains("system.int64"))
  465. // {
  466. // pi.SetValue(obj, Int64.Parse(dr[row[0].ToString()].ToString()), null);
  467. // }
  468. // if (pi.PropertyType.ToString().ToLower().Contains("system.int32"))
  469. // {
  470. // pi.SetValue(obj, Int32.Parse(dr[row[0].ToString()].ToString()), null);
  471. // }
  472. // else if (pi.PropertyType.ToString().ToLower().Contains("system.datetime"))
  473. // {
  474. // pi.SetValue(obj, Convert.ToDateTime(dr[row[0].ToString()].ToString()), null);
  475. // }
  476. // else if (pi.PropertyType.ToString().ToLower().Contains("system.boolean"))
  477. // {
  478. // pi.SetValue(obj, Convert.ToBoolean(dr[row[0].ToString()].ToString()), null);
  479. // }
  480. // else if (pi.PropertyType.ToString().ToLower().Contains("system.single"))
  481. // {
  482. // pi.SetValue(obj, Convert.ToSingle(dr[row[0].ToString()].ToString()), null);
  483. // }
  484. // else if (pi.PropertyType.ToString().ToLower().Contains("system.double"))
  485. // {
  486. // pi.SetValue(obj, Convert.ToDouble(dr[row[0].ToString()].ToString()), null);
  487. // }
  488. // else
  489. // {
  490. // pi.SetValue(obj, dr[md.FieldMeteDatas[pi.Name].ColumnName], null);
  491. // }
  492. // }
  493. // else
  494. // pi.SetValue(obj, null, null);//为空,但不为Null
  495. // }
  496. // #endregion
  497. // }
  498. // }
  499. // if (pi.Name == "PersistType")
  500. // {
  501. // pi.SetValue(obj, EntityPersistType.Update, null);
  502. // }
  503. // }
  504. // return obj;
  505. //}
  506. #endregion
  507. /// <summary>
  508. /// 设置初始值
  509. /// </summary>
  510. /// <param name="FieldName">字段名称</param>
  511. /// <param name="defaultValue">默认值</param>
  512. private static Dictionary<string, EntityValue> SetChanaged(string FieldName, object defaultValue, Dictionary<string, EntityValue> Values)
  513. {
  514. if (!Values.ContainsKey(FieldName))
  515. {
  516. EntityValue val = new EntityValue();
  517. val.OriginalValue = defaultValue;
  518. val.FieldName = FieldName;
  519. val.IsChanage = false;
  520. Values.Add(FieldName, val);
  521. }
  522. else
  523. {
  524. Values[FieldName].OriginalValue = defaultValue;
  525. Values[FieldName].IsChanage = false;
  526. }
  527. return Values;
  528. }
  529. }
  530. }