C#.net開發 List與DataTable相互轉換

來源:互聯網
上載者:User

標籤:取出   類型   sqlserver   stc   dbn   setvalue   轉換   list   OWIN   

1、DataTable轉List集合
        /// <summary>        /// DataTable轉化為List集合        /// </summary>        /// <typeparam name="T">實體物件</typeparam>        /// <param name="dt">datatable表</param>        /// <param name="isStoreDB">是否存入資料庫datetime欄位,date欄位沒事,取出不用判斷</param>        /// <returns>返回list集合</returns>        public static List<T> TableToList<T>(DataTable dt, bool isStoreDB = true)        {            List<T> list = new List<T>();            Type type = typeof(T);            //List<string> listColums = new List<string>();             PropertyInfo[] pArray = type.GetProperties(); //集合屬性數組             foreach (DataRow row in dt.Rows)              {               T entity = Activator.CreateInstance<T>(); //建立對象執行個體                foreach (PropertyInfo p in pArray)                {                   if (!dt.Columns.Contains(p.Name) || row[p.Name] == null || row[p.Name] == DBNull.Value)                  {                      continue;  //DataTable列中不存在集合屬性或者欄位內容為空白則,跳出迴圈,進行下個迴圈                     }                                  if (isStoreDB && p.PropertyType == typeof(DateTime) && Convert.ToDateTime(row[p.Name]) < Convert.ToDateTime("1753-01-01"))                     {                      continue;                  }                   try {                    var obj = Convert.ChangeType(row[p.Name], p.PropertyType);//類型強轉,將table欄位類型轉為集合欄位類型                     p.SetValue(entity, obj, null);                   }                   catch (Exception)                   {                                           // throw;                   }                                       //if (row[p.Name].GetType() == p.PropertyType)                   //{                   //    p.SetValue(entity, row[p.Name], null); //如果不考慮類型異常,foreach下面只要這一句就行                   //}                                       //object obj = null;                   //if (ConvertType(row[p.Name], p.PropertyType,isStoreDB, out obj))                   //{                                                           //    p.SetValue(entity, obj, null);                   //}                                }                list.Add(entity);            }           return list;        }

 isStoreDB形參是在考慮List轉化的DataTale資料要不要儲存資料庫,sqlserver資料中,時間類型date和datetime範圍不同,date時間範圍是在元年1月1日到9999年12月31日,datetime時間範圍是在1753年1月1日到9999年12月31日,不在範圍內的時間儲存到資料庫產生異常,因此加上時間限定,預設為存入資料庫中資料。

 

2、List集合轉DataTable
        /// <summary>        /// List集合轉DataTable        /// </summary>        /// <typeparam name="T">實體類型</typeparam>        /// <param name="list">傳入集合</param>        /// <param name="isStoreDB">是否存入資料庫DateTime欄位,date時間範圍沒事,取出展示不用設定TRUE</param>        /// <returns>返回datatable結果</returns>        public static DataTable ListToTable<T>(List<T> list, bool isStoreDB = true)        {            Type tp = typeof(T);            PropertyInfo[] proInfos = tp.GetProperties();            DataTable dt = new DataTable();            foreach (var item in proInfos)            {                dt.Columns.Add(item.Name, item.PropertyType); //添加列明及對應類型            }            foreach (var item in list)            {                DataRow dr = dt.NewRow();                foreach (var proInfo in proInfos)                {                    object obj = proInfo.GetValue(item);                    if (obj == null)                    {                        continue;                    }                    //if (obj != null)                    // {                    if (isStoreDB && proInfo.PropertyType == typeof(DateTime) && Convert.ToDateTime(obj) < Convert.ToDateTime("1753-01-01"))                    {                        continue;                    }                    // dr[proInfo.Name] = proInfo.GetValue(item);                    dr[proInfo.Name] = obj;                    // }                }                dt.Rows.Add(dr);            }            return dt;        }

 

3、提取DataTable某一行轉為指定對象
        /// <summary>        /// table指定行轉對象        /// </summary>        /// <typeparam name="T">實體</typeparam>        /// <param name="dt">傳入的表格</param>        /// <param name="rowindex">table行索引,預設為第一行</param>        /// <returns>返回實體物件</returns>        public static T TableToEntity<T>(DataTable dt, int rowindex = 0, bool isStoreDB = true)        {            Type type = typeof(T);            T entity = Activator.CreateInstance<T>(); //建立對象執行個體            if (dt == null)            {                return entity;            }            //if (dt != null)            //{            DataRow row = dt.Rows[rowindex]; //要查詢的行索引            PropertyInfo[] pArray = type.GetProperties();            foreach (PropertyInfo p in pArray)            {                if (!dt.Columns.Contains(p.Name) || row[p.Name] == null || row[p.Name] == DBNull.Value)                {                    continue;                }                 if (isStoreDB && p.PropertyType == typeof(DateTime) && Convert.ToDateTime(row[p.Name]) < Convert.ToDateTime("1753-01-02"))                {                    continue;                }                try                {                    var obj = Convert.ChangeType(row[p.Name], p.PropertyType);//類型強轉,將table欄位類型轉為對象欄位類型                    p.SetValue(entity, obj, null);                }                catch (Exception)                {                    // throw;                }                // p.SetValue(entity, row[p.Name], null);                               }            //  }            return entity;        }

 

C#.net開發 List與DataTable相互轉換

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.