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
原文地址:https://www.cnblogs.com/zonzi/p/12575653.html