zoukankan      html  css  js  c++  java
  • 利用反射将Datatable、SqlDataReader转换成List模型

    1. DataTable转IList

    public class DataTableToList<T>whereT :new()

    {

    ///<summary>

    ///利用反射将Datatable转换成List模型

    ///</summary>

    ///<param name="dt"></param>

    ///<returns></returns>

    public static List<T> ConvertToList(DataTabledt)

    {

    List<T> list =newList<T>();

    Typetype =typeof(T);

    stringtempName =string.Empty;

    foreach(DataRowdrindt.Rows)

    {

    T t =newT();

    PropertyInfo[] propertys =
    t.GetType().GetProperties();

    foreach(PropertyInfopiinpropertys)

    {

    tempName = pi.Name;

    if(dt.Columns.Contains(tempName))

    {

    if(!pi.CanWrite)

    {

    continue;

    }

    var value = dr[tempName];

    if(value !=DBNull.Value)

    {

    pi.SetValue(t, value,null);

    }

    }

    }

    list.Add(t);

    }

    returnlist;

    }

    }

    2. SqlDataReader转IList

            /// <summary>
            /// 判断SqlDataReader是否存在某列
            /// </summary>
            /// <param name="dr">SqlDataReader</param>
            /// <param name="columnName">列名</param>
            /// <returns></returns>
            private bool readerExists(SqlDataReader dr, string columnName)
            {
    
                dr.GetSchemaTable().DefaultView.RowFilter = "ColumnName= '" + columnName + "'";
    
                return (dr.GetSchemaTable().DefaultView.Count > 0);
    
            }
    
            ///<summary>
            ///利用反射和泛型将SqlDataReader转换成List模型
            ///</summary>
            ///<param name="sql">查询sql语句</param>
            ///<returns></returns>
    
            public IList<T> ExecuteToList<T>(string sql) where T : new()
    
            {
                IList<T> list;
    
                Type type = typeof (T);
    
                string tempName = string.Empty;
    
                using (SqlDataReader reader = ExecuteReader(sql))
                {
                    if (reader.HasRows)
                    {
                        list = new List<T>();
                        while (reader.Read())
                        {
                            T t = new T();
    
                            PropertyInfo[] propertys = t.GetType().GetProperties();
    
                            foreach (PropertyInfo pi in propertys)
                            {
                                tempName = pi.Name;
    
                                if (readerExists(reader, tempName))
                                {
                                    if (!pi.CanWrite)
                                    {
                                        continue;
                                    }
                                    var value = reader[tempName];
    
                                    if (value != DBNull.Value)
                                    {
                                        pi.SetValue(t, value, null);
                                    }
    
                                }
    
                            }
    
                            list.Add(t);
    
                        }
                        return list;
                    }
                }
                return null;
            }


    3、结果集从存储过程获取

      /// <summary>
            /// 处理存储过程
            /// </summary>
            /// <param name="spName">存储过程名</param>
            /// <param name="parameters">参数数组</param>
            /// <returns>sql数据流</returns>
            protected virtual SqlDataReader ExecuteReaderSP(string spName, ArrayList parameters)
            {
                SqlDataReader result = null;
                cmd.CommandText = spName;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Clear();
                if (parameters != null)
                {
                    foreach (SqlParameter param in parameters)
                    {
                        cmd.Parameters.Add(param);
                    }
                }
                try
                {
                    Open();
                    result = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
                catch (Exception e)
                {
                    if (result != null && (!result.IsClosed))
                    {
                        result.Close();
                    }
                    LogHelper.WriteLog("\r\n方法异常【ExecuteReaderSP(string spName, ArrayList parameters)】" + spName, e);
                    throw new Exception(e.Message);
                }
                return result;
            }

           ///<summary>
            ///利用反射将SqlDataReader转换成List模型
            ///</summary>
            ///<param name="spName">存储过程名称</param>
            ///<returns></returns>
    
            public IList<T> ExecuteQueryListSP<T>(string spName, params SqlParameter[] listParams) where T : new()
            {
                IList<T> list;
    
                Type type = typeof(T);
    
                string tempName = string.Empty;
    
                using (SqlDataReader reader = ExecuteReaderSP(spName, new ArrayList(listParams)))
                {
                    if (reader.HasRows)
                    {
                        list = new List<T>();
                        while (reader.Read())
                        {
                            T t = new T();
    
                            PropertyInfo[] propertys = t.GetType().GetProperties();
    
                            foreach (PropertyInfo pi in propertys)
                            {
                                tempName = pi.Name;
    
                                //for (int intField = 0; intField < reader.FieldCount; intField++)
                                //{//遍历该列名是否存在
                                //}
    
                                if (readerExists(reader, tempName))
                                {
                                    if (!pi.CanWrite)
                                    {
                                        continue;
                                    }
                                    var value = reader[tempName];
    
                                    if (value != DBNull.Value)
                                    {
                                        pi.SetValue(t, value, null);
                                    }
    
                                }
    
                            }
    
                            list.Add(t);
    
                        }
                        return list;
                    }
                }
                return null;
            }


  • 相关阅读:
    JDBC遇到向ORACLE数据库表执行插入操作时,报错“列在此处不允许”
    关于对称加密和非对称加密以及签名,认证和证书的理解
    .net framework 各版本区别
    数据库设计三大范式
    业务系统设计
    修改 Windows 服务器默认远程端口3389
    iis读取不到本地证书问题 提示已经导入成功
    HTTPS 建立连接的详细过程
    使用ServiceStack构建Web服务
    转-微信支付(公众号支付JSAPI)
  • 原文地址:https://www.cnblogs.com/dashi/p/4034651.html
Copyright © 2011-2022 走看看