1. 程式人生 > >C#.net開發 List與DataTable相互轉換

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

inf columns serve property eat 這一 異常 bject 屬性

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相互轉換