zoukankan      html  css  js  c++  java
  • C# ADO.NET+反射读取数据库并转换为List

     public List<T> QueryByADO<T>(string connStr, string sql) where T : class, new()
            {
                using (SqlConnection conn = new SqlConnection())
                {
                    try
                    {
                        conn.ConnectionString = connStr;
                        conn.Open();
                        SqlDataAdapter myda = new SqlDataAdapter(sql, conn);
                        DataTable dt = new DataTable();
                        myda.Fill(dt);
                        return ConvertToModel<T>(dt);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        conn.Close();
                    }
                }
            }
    
            /// <summary>
            /// 将DataTable数据源转换成实体类
            /// </summary>
            public List<T> ConvertToModel<T>(DataTable dt) where T : class, new()
            {
                List<T> ts = new List<T>();// 定义集合
                foreach (DataRow dr in dt.Rows)
                {
                    T t = new T();
                    PropertyInfo[] propertys = t.GetType().GetProperties();// 获得此模型的公共属性
                    foreach (PropertyInfo pi in propertys)
                    {
                        if (dt.Columns.Contains(pi.Name))
                        {
                            if (!pi.CanWrite) continue;
                            var value = dr[pi.Name];
                            if (value != DBNull.Value)
                            {
                                if (pi.PropertyType.FullName.Contains("System.Nullable"))
                                {
                                    pi.SetValue(t, Convert.ChangeType(value, (Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType)), null);
                                }
                                else
                                {
                                    switch (pi.PropertyType.FullName)
                                    {
                                        case "System.Decimal":
                                            pi.SetValue(t, decimal.Parse(value.ToString()), null);
                                            break;
                                        case "System.String":
                                            pi.SetValue(t, value.ToString(), null);
                                            break;
                                        case "System.Char":
                                            pi.SetValue(t, Convert.ToChar(value), null);
                                            break;
                                        case "System.Guid":
                                            pi.SetValue(t,value, null);
                                            break;
                                        case "System.Int16":
                                            pi.SetValue(t, Convert.ToInt16(value), null);
                                            break;
                                        case "System.Int32":
                                            pi.SetValue(t, int.Parse(value.ToString()), null);
                                            break;
                                        case "System.Int64":
                                            pi.SetValue(t, Convert.ToInt64(value), null);
                                            break;
                                        case "System.Byte[]":
                                            pi.SetValue(t, Convert.ToByte(value), null);
                                            break; 
                                        case "System.Boolean":
                                            pi.SetValue(t,Convert.ToBoolean(value), null);
                                            break;
                                        case "System.Double":
                                            pi.SetValue(t, Convert.ToDouble(value.ToString()), null);
                                            break;
                                        case "System.DateTime":
                                            pi.SetValue(t, value ?? Convert.ToDateTime(value), null);
                                            break;
                                        default:
                                            throw new Exception("类型不匹配:" + pi.PropertyType.FullName);
                                    }
                                }
                            }
                        }
                    }
                    ts.Add(t);
                }
                return ts;
            }
    

      

     public List<T> QueryByADO<T>(string connStr, string sql) where T : class, new()
            {
                using (SqlConnection conn = new SqlConnection())
                {
                    try
                    {
                        conn.ConnectionString = connStr;
                        conn.Open();
                        SqlDataAdapter myda = new SqlDataAdapter(sql, conn);
                        DataTable dt = new DataTable();
                        myda.Fill(dt);
                        return ConvertToModel<T>(dt);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        conn.Close();
                    }
                }
            }
    
            /// <summary>
            /// 将DataTable数据源转换成实体类
            /// </summary>
            public List<T> ConvertToModel<T>(DataTable dt) where T : class, new()
            {
                List<T> ts = new List<T>();// 定义集合
                foreach (DataRow dr in dt.Rows)
                {
                    T t = new T();
                    PropertyInfo[] propertys = t.GetType().GetProperties();// 获得此模型的公共属性
                    foreach (PropertyInfo pi in propertys)
                    {
                        if (dt.Columns.Contains(pi.Name))
                        {
                            if (!pi.CanWrite) continue;
                            var value = dr[pi.Name];
                            if (value != DBNull.Value)
                            {
                                if (!pi.PropertyType.IsGenericType)
                                {
                                    //非泛型
                                    pi.SetValue(t, value==null ? null : Convert.ChangeType(value, pi.PropertyType), null);
                                }
                                else
                                {
                                    //泛型Nullable<>
                                    Type genericTypeDefinition = pi.PropertyType.GetGenericTypeDefinition();
                                    if (genericTypeDefinition == typeof(Nullable<>))
                                    {
                                        pi.SetValue(t, value == null ? null : Convert.ChangeType(value, Nullable.GetUnderlyingType(pi.PropertyType)), null);
                                    }
                                }
                            }
                        }
                    }
                    ts.Add(t);
                }
                return ts;
            }
    //参考连接 https://blog.csdn.net/xiaohan2826/article/details/8536074
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)
  • 原文地址:https://www.cnblogs.com/wangboke/p/9149985.html
Copyright © 2011-2022 走看看