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
  • 相关阅读:
    parser_url
    fsockopen
    MySql支持的数据类型
    MySql常用字符集
    MySQL各大存储引擎
    MySql数据库基础
    Python 流程控制 超全解析(不可错过)
    python 序列解包(解压缩)
    python常量 (最全常量解析)
    python内存管理(通俗易懂,详细可靠)
  • 原文地址:https://www.cnblogs.com/wangboke/p/9149985.html
Copyright © 2011-2022 走看看