zoukankan      html  css  js  c++  java
  • SqlDataReader 子成员过多,如何自动遍历执行?

    ASP.NET   相关

      关于SqlDataReader  不需要重复字段输入,类的成员字段过多编写起来麻烦 ,一个方法 搞定 ,见下:

    上图 : 查询过多数据的话这个方式比较节省性能 

    1.问题来了: 如果字段很多怎么办??  如何自动遍历所有子成员?见下代码   

    只需要给  sqldatareader给此方法就行 下边图我的  :类名为user 只需要给类名个sqldatareader执行的结果就可以自动遍历:

     使用这个泛型方法处理 直接 实现效果哟   DataReaderToList<t> 方法见下

     代码见下边:

      1 /// <summary>
      2 /// 工具类 SqlDataReader 查询方便返回
      3 /// </summary>
      4 /// <typeparam name="T"></typeparam>
      5 /// <param name="SDR"></param>
      6 /// <returns></returns>
      7 private static List<T> DataReaderToList<T>(SqlDataReader SDR) where T : class
      8 {
      9 List<T> ListData = new List<T>();
     10 
     11 if (SDR.HasRows)
     12 {
     13 ListData.Clear();
     14 while (SDR.Read())
     15 {
     16 object Obj = System.Activator.CreateInstance(typeof(T));
     17 Type ObjType = Obj.GetType();
     18 #region 一行数据赋值给一个对象
     19 for (int i = 0; i < SDR.FieldCount; i++)
     20 {
     21 PropertyInfo PI = ObjType.GetProperty(SDR.GetName(i));
     22 if (PI != null)
     23 {
     24 string PTName = PI.PropertyType.Name.ToString();
     25 string FullName = PI.PropertyType.FullName;
     26 string Name = PI.Name;
     27 
     28 object Value = PI.GetValue(Obj, null);
     29 
     30 switch (PI.PropertyType.ToString())
     31 {
     32 case "System.Int64":
     33 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt64(SDR[Name]), null);
     34 break;
     35 case "System.Byte[]":
     36 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : (byte[])SDR[Name], null);
     37 break;
     38 case "System.Boolean":
     39 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToBoolean(SDR[Name]), null);
     40 break;
     41 case "System.String":
     42 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToString(SDR[Name]), null);
     43 break;
     44 case "System.DateTime":
     45 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDateTime(SDR[Name]), null);
     46 break;
     47 case "System.Decimal":
     48 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDecimal(SDR[Name]), null);
     49 break;
     50 case "System.Double":
     51 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDouble(SDR[Name]), null);
     52 break;
     53 case "System.Int32":
     54 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt32(SDR[Name]), null);
     55 break;
     56 case "System.Single":
     57 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToSingle(SDR[Name]), null);
     58 break;
     59 case "System.Byte":
     60 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToByte(SDR[Name]), null);
     61 break;
     62 default:
     63 int Chindex = PTName.IndexOf("Nullable");
     64 if (FullName.IndexOf("System.Int64") >= 0)
     65 {
     66 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt64(SDR[Name]), null);
     67 }
     68 
     69 if (FullName.IndexOf("System.Boolean") >= 0)
     70 {
     71 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToBoolean(SDR[Name]), null);
     72 }
     73 
     74 if (FullName.IndexOf("System.String") >= 0)
     75 {
     76 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToString(SDR[Name]), null);
     77 }
     78 
     79 if (FullName.IndexOf("System.DateTime") >= 0)
     80 {
     81 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDateTime(SDR[Name]), null);
     82 }
     83 
     84 if (FullName.IndexOf("System.Decimal") >= 0)
     85 {
     86 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDecimal(SDR[Name]), null);
     87 }
     88 
     89 if (FullName.IndexOf("System.Double") >= 0)
     90 {
     91 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDouble(SDR[Name]), null);
     92 }
     93 
     94 if (FullName.IndexOf("System.Int32") >= 0)
     95 {
     96 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt32(SDR[Name]), null);
     97 }
     98 
     99 if (FullName.IndexOf("System.Single") >= 0)
    100 {
    101 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToSingle(SDR[Name]), null);
    102 }
    103 
    104 if (FullName.IndexOf("System.Byte") >= 0)
    105 {
    106 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToByte(SDR[Name]), null);
    107 }
    108 
    109 if (FullName.IndexOf("System.Int16") >= 0)
    110 {
    111 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt16(SDR[Name]), null);
    112 }
    113 
    114 if (FullName.IndexOf("System.UInt16") >= 0)
    115 {
    116 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToUInt16(SDR[Name]), null);
    117 }
    118 
    119 if (FullName.IndexOf("System.UInt32") >= 0)
    120 {
    121 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToUInt32(SDR[Name]), null);
    122 }
    123 
    124 if (FullName.IndexOf("System.UInt64") >= 0)
    125 {
    126 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToUInt64(SDR[Name]), null);
    127 }
    128 
    129 if (FullName.IndexOf("System.SByte") >= 0)
    130 {
    131 PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToSByte(SDR[Name]), null);
    132 }
    133 break;
    134 }
    135 
    136 }
    137 }
    138 #endregion
    139 ListData.Add(Obj as T);
    140 }
    141 }
    142 if (!SDR.IsClosed)
    143 SDR.Close();
    144 
    145 return ListData;
    146 }
    View Code
  • 相关阅读:
    第九周学习进度
    用户场景描述
    第九天
    第10天
    求两个有序数组的中值
    计算字符串中最长子字符串的长度
    计算两个数之和
    将string 转int
    判断一个int 型整数 是否为回文数
    php 对象的一些特性
  • 原文地址:https://www.cnblogs.com/zonzi/p/12575653.html
Copyright © 2011-2022 走看看