• 当前架构中的get方法 荣


    一、       编写目的

    当前架构中,通过get方法取得数据库中的一条记录。当前这种方法有几个问题:

    1.       如何处理空数据的问题,例如某条记录的第x列的记录为空时,如何写入到相关DT类的相关字段(属性)中。

    2.       2: 需要对每一个数据库设置一个从DataRowIdataReaderDT类中写入数据的代码。

    以上这两点,对日常开发带来一定的疑惑。本文试图对上面两个问题,提出一个解决方案。

    二、       代码分析

    以下是对get方法代码及其相关代码的分析。

    (一)       当前实现代码

    DB类中Get方法:

            /// <summary>

            /// 获取一条纪录

            /// </summary>

            public AwakedetailDT Get(int sysCode) {

                AwakedetailDT detail= new AwakedetailDT();

                try {

                    string sql= "select * from awakeDetail where (sysCode="+ sysCode+")";

                    DataTable dt= this.ExecuteForDataTable(sql);

                    DataRow dr=null;

                    int rowCount= dt.Rows.Count;

                    if (rowCount>0) {

                        dr= dt.Rows[0];

                        detail.sysCode= Convert.ToInt32(dr["sysCode"]);

                        detail.personID= Convert.ToInt32(dr["personID"]);

                        detail.pkID= Convert.ToInt32(dr["pkID"]);

                        detail.awakeTitle= Convert.ToString(dr["awakeTitle"]);

                        detail.aimURL= Convert.ToString(dr["aimURL"]);

                        detail.columnName= Convert.ToString(dr["columnName"]);

                        detail.awakeType= Convert.ToInt32(dr["awakeType"]);

                        detail.awakeMode= Convert.ToInt32(dr["awakeMode"]);

                        detail.circle= Convert.ToInt32(dr["circle"]);

                        detail.circleType= Convert.ToInt32(dr["circleType"]);

                        detail.awakeTime= Convert.ToDecimal(dr["awakeTime"]);

                        detail.advDays= Convert.ToInt32(dr["advDays"]);

                        detail.lastTime= Convert.ToDecimal(dr["lastTime"]);

                        detail.finished= Convert.ToInt32(dr["finished"]);

                    }

                }

                catch(Exception ex) {

                    throw ex;

                }

                finally {

                }

                return detail;

            }

    在上面的代码中,存在如下几个问题:

    1:如果dt.Rows[0]中的列“awakeTime”为空的时候,编译本段代码就会出现问题。

    2:每个DB中,要重新写一遍代码:

    int rowCount= dt.Rows.Count;

                    if (rowCount>0) {

                        dr= dt.Rows[0];

    .

    可重用性差。

    (二)       一个解决方案

    以下是解决上述问题的一个解决方案:

    首先,取得一条数据库表的记录到DataTableIdataReader中。然后调用类CBO来生成需要的对象。在生成对象的时候,会判断DataTableIdataReader中的数据是否为空,如果为空,以类Null中的值填充该数据。

    DB类中的get方法:取得数据库中的记录,并生成相关对象:

            /// <summary>

            /// Description:取得一条记录。

            /// </summary>

            /// <param name="detail">一条记录</param>

            /// <returns>一条记录</returns>

            /// <author></author>

            /// <log date="2000-01-01">创建</log>

            public object Get(object detail)

            {

                string sql= "select * from awakeDetail where (sysCode="+ sysCode+")";

                IdataReader dt= this.ExecuteForDataTable(sql);

     

               //调用CBO中的FillConllection方法生成AwakedetailDT对象

                return CBO.FillObject(read, detail.GetType(), true);

            }

    CBO:生成需要的对象。

    using System;

    using System.Data;

    using System.Web.Caching;

    using System.Reflection;

    using System.Xml;

    using System.Xml.Serialization;

    using System.Text;

    using System.IO;

    using System.Collections;

    using Microsoft.VisualBasic;

     

    namespace DOCNET.Utils

    {

         /// <summary>

         /// CBO 的摘要说明。

         /// </summary>

         public class CBO

         {

             public CBO()

             {

                  //

                  // TODO: 在此处添加构造函数逻辑

                  //

             }

     

             /// <summary>

             /// 返回存储某类型[objType]的所有属性(property)的集合。

             /// </summary>

             /// <param name="objType">类型(类、接口、枚举等)</param>

             /// <returns>属性集合</returns>

             public static ArrayList GetPropertyInfo(Type objType)

             {

                  ArrayList objProperties = null;

     

                  // 如果属性集合为空

                  if (objProperties == null)

                  {

                       // 初始化集合

                       objProperties = new ArrayList();

                       // PropertyInfo:发现属性的特性并提供对属性元数据的访问。

                       // GetProperties:返回当前Type的所有公共属性。

                       foreach (PropertyInfo objProperty in objType.GetProperties())

                       {

                           // 用属性填充集合

                           objProperties.Add(objProperty);

                       }

                  }

     

                  // 返回类型集合

                  return objProperties;

             }

     

             /// <summary>

             /// 返回dr属性字段索引的数组。

             /// </summary>

             /// <param name="objProperties">属性数组[存储着dr的列字段名称的属性]</param>

             /// <param name="dr"></param>

             /// <returns>字段索引的数组</returns>

             public static int[] GetOrdinals(ArrayList objProperties, IDataReader dr)

             {

                  // 形成对应属性集合的整合数组

                  int[] arrOrdinals = new int[objProperties.Count];

     

                  int count;

     

                  if (dr != null)

                  {

                       count = objProperties.Count;

                       for (int intProperty = 0; intProperty < count; intProperty++)

                       {

                           arrOrdinals[intProperty] = -1;

                           try

                           {

                                PropertyInfo propertyInfo = (PropertyInfo)objProperties[intProperty];

     

                                // GetOrdinal:返回命名字段的索引。

                                // propertyInfo.Name:获取此成员的名称。

                                // 该行试图返回字段名称为propertyInfo.NameDataReader的列索引

                                arrOrdinals[intProperty] = dr.GetOrdinal(propertyInfo.Name);

                           }

                           catch

                           {

                           }

                       }

                  }

     

                  // 返回命名字段索引的数组

                  return arrOrdinals;

             }

     

             /// <summary>

             /// objType类型的对象逐个赋属性值并返回该对象。

             /// </summary>

             /// <param name="objType">对象类型</param>

             /// <param name="dr">存储记录的DataReader</param>

             /// <param name="objProperties">属性集合</param>

             /// <param name="arrOrdinals">索引集合</param>

             /// <returns>objType类型对象</returns>

             private static object CreateObject(Type objType, IDataReader dr, ArrayList objProperties, int[] arrOrdinals)

             {

                  // 在这儿声明对象,估计是为了性能考虑

                  PropertyInfo objPropertyInfo;

                  object objValue;

                  Type objPropertyType = null;

     

                  // 创建objType类型的对象

                  object objObject = Activator.CreateInstance(objType);

     

                  int objPropertiesCount = objProperties.Count;

                  for (int intProperty = 0; intProperty < objPropertiesCount; intProperty++)

                  {

                       // 取得第intProperty个属性

                       objPropertyInfo = (PropertyInfo)objProperties[intProperty];

     

                       // 如果该属性允许写入/含有Set的属性

                       if (objPropertyInfo.CanWrite)

                       {

                           // objValue设置为空  根据objPropertyInfo.PropertyType

                           objValue = Null.SetNull(objPropertyInfo);

     

                           // 如果索引不存在

                           if (arrOrdinals[intProperty] == -1)

                           {

                                continue;

                           }

     

                           // 判断dr的第arrOrdinals[intProperty]格元素是空

                           if (Information.IsDBNull(dr.GetValue(arrOrdinals[intProperty])))

                           {

                                // 将给定对象的属性值设置为给定值[即相应的空值]

                                objPropertyInfo.SetValue(objObject, objValue, null);

                                continue;

                           }                          

     

                           // 如果无错误,赋值,设置下一个属性

                           try

                           {

                                // 将给定对象的属性值设置为给定值

                                objPropertyInfo.SetValue(objObject, dr.GetValue(arrOrdinals[intProperty]), null);

                                continue;

                           }

                           catch

                           {

                           }

     

                           // 如果设置不成功

                           try

                           {

                                // 取得相应数据类型

                                objPropertyType = objPropertyInfo.PropertyType;

     

                                // BaseType:获取当前 System.Type 直接从中继承的类型

                                // 如果类型不是枚举

                                if (!objPropertyType.BaseType.Equals(typeof(System.Enum)))

                                {

                                    objPropertyInfo.SetValue(objObject, Convert.ChangeType(dr.GetValue(arrOrdinals[intProperty]), objPropertyType), null);

                                     continue;

                                }

     

                                // BaseType:获取当前 System.Type 直接从中继承的类型

                                // 如果类型是枚举

                                //  判断dr的第arrOrdinals[intProperty]格元素是不是数字

                                if (Information.IsNumeric(dr.GetValue(arrOrdinals[intProperty])))

                                {

                                     // 将给定对象的属性值设置为给定值 即第Convert.ToInt32(dr.GetValue(arrOrdinals[intProperty])个枚举值

                                     ((PropertyInfo)objProperties[intProperty]).SetValue(objObject, System.Enum.ToObject(objPropertyType, Convert.ToInt32(dr.GetValue(arrOrdinals[intProperty]))), null);

                                }

                                else

                                {

                                     // 将给定对象的属性值设置为给定值

                                     ((PropertyInfo)objProperties[intProperty]).SetValue(objObject, System.Enum.ToObject(objPropertyType,dr.GetValue(arrOrdinals[intProperty])), null);

                                }

                           }

                           catch

                           {

                                // 将给定对象的属性值设置为给定值

                                objPropertyInfo.SetValue(objObject, Convert.ChangeType(dr.GetValue(arrOrdinals[intProperty]), objPropertyType), null);

                           }

                       }

                  }

     

                  // 返回objObject对象

                  return objObject;

             }

     

             /// <summary>

             /// dr填充一个objType对象,并返回。

             /// </summary>

             /// <param name="dr">存储对象数据的DataReader</param>

             /// <param name="objType">对象类型</param>

             /// <returns>objType对象</returns>

             public static object FillObject(IDataReader dr, Type objType)

             {

                  return FillObject(dr, objType, true);

             }

     

             /// <summary>

             /// dr填充一个objType对象,并返回。

             /// </summary>

             /// <param name="dr">存储对象数据的DataReader</param>

             /// <param name="objType">对象类型</param>

             /// <param name="ManageDataReader"></param>

             /// <returns>objType对象</returns>

             public static object FillObject(IDataReader dr, Type objType, bool ManageDataReader)

             {

                  object objFillObject;

     

                  // GetPropertyInfo:返回存储某类型的所有属性的集合。

                  // 取得属性集合

                  ArrayList objProperties = GetPropertyInfo(objType);

     

                  // GetOrdinals:返回dr属性字段索引的数组。

                  // 返回索引数组

                  int[] arrOrdinals = GetOrdinals(objProperties, dr);

     

                  bool Continue = true;

     

                  // 要不要继续,如果dr不到最后,继续

                  if (ManageDataReader)

                  {

                       Continue = false;

     

                       if (dr.Read())

                       {

                           Continue = true;

                       }

                  }

     

                  if (Continue)

                  {

                       // CreateObject:给objType类型的对象逐个赋值并返回。

                       objFillObject = CreateObject(objType, dr, objProperties, arrOrdinals);

                  }

                  else

                  {

                       objFillObject = null;

                  }

     

                  if (ManageDataReader)

                  {

                       if (dr != null)

                       {

                           dr.Close();

                       }

                  }

     

                  // 返回对象

                  return objFillObject;

             }

     

             /// <summary>

             /// dr填充一个objType对象数组,并返回。

             /// </summary>

             /// <param name="dr">存储对象数据的DataReader</param>

             /// <param name="objType">对象类型</param>

             /// <returns>对象数组</returns>

             public static ArrayList FillConllection(IDataReader dr, Type objType)

             {

                  // 一个集合

                  ArrayList objFillCollection = new ArrayList();

                  object objFillObject;

     

                  // GetPropertyInfo:返回存储某类型的所有属性的集合。

                  // 取得objType/接口的属性集合

                  ArrayList objProperties = GetPropertyInfo(objType);

     

                  // GetOrdinals:返回dr属性字段索引的数组。

                  // 返回索引数组

                  int[] arrOrdinals = GetOrdinals(objProperties, dr);

     

                  // 生成多个objType对象

                  while(dr.Read())

                  {

                       objFillObject = CreateObject(objType, dr, objProperties, arrOrdinals);

                       objFillCollection.Add(objFillObject);

                  }

     

                  if (dr != null)

                  {

                       dr.Close();

                  }

     

                  // 返回对象数组

                  return objFillCollection;

             }

     

             /// <summary>

             /// dr填充一个IList,并返回。

             /// </summary>

             /// <param name="dr">存储对象数据的DataReader</param>

             /// <param name="objType">对象类型</param>

             /// <param name="objToFill">IList</param>

             /// <returns>IList</returns>

             public static IList FillCollection(IDataReader dr, Type objType, IList objToFill)

             {

                  object objFillObject;

     

                  // GetPropertyInfo:返回存储某类型的所有属性的集合。

                  // 取得objType/接口的属性集合

                  ArrayList objProperties = GetPropertyInfo(objType);

     

                  // GetOrdinals:返回dr属性字段索引的数组。

                  // 返回索引数组

                  int[] arrOrdinals = GetOrdinals(objProperties, dr);

     

                  // 生成多个objType对象

                  while (dr.Read())

                  {

                       objFillObject = CreateObject(objType, dr, objProperties, arrOrdinals);

                       objToFill.Add(objFillObject);

                  }

     

                  if (dr != null)

                  {

                       dr.Close();

                  }

     

                  // 返回IList

                  return objToFill;

             }

     

     

     

     

             /// <summary>

             /// objType类型的对象赋初始值[空值]

             /// </summary>

             /// <param name="objObject">赋值对象</param>

             /// <param name="objType">对象类型</param>

             /// <returns>赋初始值的对象</returns>

             public static object InitializeObject(object objObject, Type objType)

             {

                  PropertyInfo objPropertyInfo;

                  object objValue;

     

                  // GetPropertyInfo:返回存储某类型的所有属性的集合。

                  // 取得objType/接口的属性集合

                  ArrayList objProperties = GetPropertyInfo(objType);

     

                  // 依次赋值

                  for (int intProperty = 0; intProperty < objProperties.Count; intProperty++)

                  {

                       // 取得第intProperty个属性

                       objPropertyInfo = (PropertyInfo)objProperties[intProperty];

     

                       // 如果该属性允许写入

                       if (objPropertyInfo.CanWrite)

                       {

                           // objValue设置为空  根据objPropertyInfo.PropertyType

                           objValue = Null.SetNull(objPropertyInfo);

     

                           // 将给定对象的属性值设置为给定值

                           objPropertyInfo.SetValue(objObject, objValue, null);

                       }

                  }

     

                  // 返回对象

                  return objObject;

             }

     

             /// <summary>

             /// 根据字段名成取得字段列的索引号。

             /// </summary>

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

             /// <param name="dcl"></param>

             /// <returns></returns>

             public static int GetIndexForDataTable(string name, DataColumnCollection dcl)

             {

                  int count = dcl.Count;

                  for (int i = 0; i < count; i++)

                  {

                       if (string.Compare(dcl[i].ColumnName, name, true) == 0)

                       {

                           return i;

                       }

                  }

     

                  return -1;

             }

     

             // <summary>

             /// 返回dr属性字段索引的数组。

             /// </summary>

             /// <param name="objProperties">属性数组[存储着dr的列字段名称的属性]</param>

             /// <param name="dr"></param>

             /// <returns>字段索引的数组</returns>

             public static int[] GetOrdinals(ArrayList objProperties, DataRow dr)

             {

                  // 形成对应属性集合的整合数组

                  int[] arrOrdinals = new int[objProperties.Count];

     

                  int count;

     

                  if (dr != null)

                  {

                       DataColumnCollection dcl = dr.Table.Columns;

                       count = objProperties.Count;

                       for (int i = 0; i < count; i++)

                       {

                           arrOrdinals[i] = -1;

                           try

                           {

                                PropertyInfo propertyInfo = (PropertyInfo)objProperties[i];

     

                                // GetOrdinal:返回命名字段的索引。

                                // propertyInfo.Name:获取此成员的名称。

                                // 该行试图返回字段名称为propertyInfo.NameDataReader的列索引

                                arrOrdinals[i] = GetIndexForDataTable(propertyInfo.Name, dcl);

                           }

                           catch

                           {

                           }

                       }

                  }

     

                  // 返回命名字段索引的数组

                  return arrOrdinals;

             }

     

             /// <summary>

             /// objType类型的对象逐个赋属性值并返回该对象。

             /// </summary>

             /// <param name="objType">对象类型</param>

             /// <param name="dr">存储记录的DataRow</param>

             /// <param name="objProperties">属性集合</param>

             /// <param name="arrOrdinals">索引集合</param>

             /// <returns>objType类型对象</returns>

             private static object CreateObject(Type objType, DataRow dr, ArrayList objProperties, int[] arrOrdinals)

             {

                  // 在这儿声明对象,估计是为了性能考虑

                  PropertyInfo objPropertyInfo;

                  object objValue;

                  Type objPropertyType = null;

     

                  // 创建objType类型的对象

                  object objObject = Activator.CreateInstance(objType);

     

                  int objPropertiesCount = objProperties.Count;

                  for (int intProperty = 0; intProperty < objPropertiesCount; intProperty++)

                  {

                       // 取得第intProperty个属性

                       objPropertyInfo = (PropertyInfo)objProperties[intProperty];

     

                       // 如果该属性允许写入/含有Set的属性

                       if (objPropertyInfo.CanWrite)

                       {

                           // objValue设置为空  根据objPropertyInfo.PropertyType

                           objValue = Null.SetNull(objPropertyInfo);

     

                           // 如果索引不存在

                           if (arrOrdinals[intProperty] == -1)

                           {

                                continue;

                           }

     

                           // 判断dr的第arrOrdinals[intProperty]格元素是空

                           if (Information.IsDBNull(dr[arrOrdinals[intProperty]]))

                           {

                                // 将给定对象的属性值设置为给定值[即相应的空值]

                                objPropertyInfo.SetValue(objObject, objValue, null);

                                continue;

                           }                          

     

                           // 如果无错误,赋值,设置下一个属性

                           try

                           {

                                // 将给定对象的属性值设置为给定值

                                objPropertyInfo.SetValue(objObject, dr[arrOrdinals[intProperty]], null);

                                continue;

                           }

                           catch

                           {

                           }

     

                           // 如果设置不成功

                           try

                           {

                                // 取得相应数据类型

                                objPropertyType = objPropertyInfo.PropertyType;

     

                                // BaseType:获取当前 System.Type 直接从中继承的类型

                                // 如果类型不是枚举

                                if (!objPropertyType.BaseType.Equals(typeof(System.Enum)))

                                {

                                     objPropertyInfo.SetValue(objObject, Convert.ChangeType(dr[arrOrdinals[intProperty]], objPropertyType), null);

                                     continue;

                                }

     

                                // BaseType:获取当前 System.Type 直接从中继承的类型

                                // 如果类型是枚举

                                //  判断dr的第arrOrdinals[intProperty]格元素是不是数字

                                if (Information.IsNumeric(dr[arrOrdinals[intProperty]]))

                                {

                                     // 将给定对象的属性值设置为给定值 即第Convert.ToInt32(dr[arrOrdinals[intProperty]]个枚举值

                                     ((PropertyInfo)objProperties[intProperty]).SetValue(objObject, System.Enum.ToObject(objPropertyType, Convert.ToInt32(dr[arrOrdinals[intProperty]])), null);

                                }

                                else

                                {

                                     // 将给定对象的属性值设置为给定值

                                     ((PropertyInfo)objProperties[intProperty]).SetValue(objObject, System.Enum.ToObject(objPropertyType,dr[arrOrdinals[intProperty]]), null);

                                }

                           }

                           catch

                           {

                                // 将给定对象的属性值设置为给定值

                                objPropertyInfo.SetValue(objObject, Convert.ChangeType(dr[arrOrdinals[intProperty]], objPropertyType), null);

                           }

                       }

                  }

     

                  // 返回objObject对象

                  return objObject;

             }

     

             /// <summary>

             /// dr填充一个objType对象,并返回。

             /// </summary>

             /// <param name="dr">存储对象数据的DataRow</param>

             /// <param name="objType">对象类型</param>

             /// <returns>objType对象</returns>

             public static object FillObject(DataRow dr, Type objType)

             {

                  return FillObject(dr, objType, true);

             }

     

             /// <summary>

             /// dr填充一个objType对象,并返回。

             /// </summary>

             /// <param name="dr">存储对象数据的DataRow</param>

             /// <param name="objType">对象类型</param>

             /// <param name="ManageDataReader"></param>

             /// <returns>objType对象</returns>

             public static object FillObject(DataRow dr, Type objType, bool ManageDataReader)

             {

                  object objFillObject;

     

                  // GetPropertyInfo:返回存储某类型的所有属性的集合。

                  // 取得属性集合

                  ArrayList objProperties = GetPropertyInfo(objType);

     

                  // GetOrdinals:返回dr属性字段索引的数组。

                  // 返回索引数组

                  int[] arrOrdinals = GetOrdinals(objProperties, dr);

     

                  bool Continue = true;

     

     

                  if (Continue)

                  {

                       // CreateObject:给objType类型的对象逐个赋值并返回。

                       objFillObject = CreateObject(objType, dr, objProperties, arrOrdinals);

                  }

                  else

                  {

                       objFillObject = null;

                  }

     

                  // 返回对象

                  return objFillObject;

             }

     

     

     

     

             /// <summary>

             /// 返回存储某类型[objType]的所有字段(property)的集合。

             /// </summary>

             /// <param name="objType">类型(类、接口、枚举等)</param>

             /// <returns>属性集合</returns>

             public static ArrayList GetFieldInfo(Type objType)

             {

                  ArrayList objFields = null;

     

                  // 如果属性集合为空

                  if (objFields == null)

                  {

                       // 初始化集合

                       objFields = new ArrayList();

                       // PropertyInfo:发现属性的特性并提供对属性元数据的访问。

                       // GetProperties:返回当前Type的所有公共属性。

                       foreach (FieldInfo objField in objType.GetFields())

                       {

                           // 用属性填充集合

                           objFields.Add(objField);

                       }

                  }

     

                  // 返回类型集合

                  return objFields;

             }

     

             /// <summary>

             /// 返回dr字段索引的数组。

             /// </summary>

             /// <param name="objfields">属性数组[存储着dr的列字段名称的属性]</param>

             /// <param name="dr"></param>

             /// <returns>字段索引的数组</returns>

             public static int[] GetOrdinalsForField(ArrayList objfields, IDataReader dr)

             {

                  // 形成对应属性集合的整合数组

                  int[] arrOrdinals = new int[objfields.Count];

     

                  int count;

     

                  if (dr != null)

                  {

                       count = objfields.Count;

                       for (int i = 0; i < count; i++)

                       {

                           arrOrdinals[i] = -1;

                           try

                           {

                                 FieldInfo  fieldInfo = ( FieldInfo)objfields[i];

     

                                // GetOrdinal:返回命名字段的索引。

                                // propertyInfo.Name:获取此成员的名称。

                                // 该行试图返回字段名称为propertyInfo.NameDataReader的列索引

                                arrOrdinals[i] = dr.GetOrdinal(fieldInfo.Name);

                           }

                           catch

                           {

                           }

                       }

                  }

     

                  // 返回命名字段索引的数组

                  return arrOrdinals;

             }

            

             /// <summary>

             /// objType类型的对象逐个赋属性值并返回该对象。

             /// </summary>

             /// <param name="objType">对象类型</param>

             /// <param name="dr">存储记录的DataReader</param>

             /// <param name="objProperties">属性集合</param>

             /// <param name="arrOrdinals">索引集合</param>

             /// <returns>objType类型对象</returns>

             private static object CreateObjectByField(Type objType, IDataReader dr, ArrayList objFields, int[] arrOrdinals)

             {

                  // 在这儿声明对象,估计是为了性能考虑

                  FieldInfo objFieldInfo;

                  object objValue;

                  Type objFieldType = null;

     

                  // 创建objType类型的对象

                  object objObject = Activator.CreateInstance(objType);

     

                  int objFieldsCount = objFields.Count;

                  for (int intProperty = 0; intProperty < objFieldsCount; intProperty++)

                  {

                       // 取得第intProperty个属性

                       objFieldInfo = (FieldInfo)objFields[intProperty];

     

                       // 如果该属性允许写入/含有Set的属性

                       if (objFieldInfo.IsPublic && (!objFieldInfo.IsInitOnly))

                       {

                           // objValue设置为空  根据objPropertyInfo.PropertyType

                           objValue = Null.SetNull(objFieldInfo);

     

                           // 如果索引不存在

                           if (arrOrdinals[intProperty] == -1)

                           {

                                continue;

                           }

     

                           // 判断dr的第arrOrdinals[intProperty]格元素是空

                           if (Information.IsDBNull(dr.GetValue(arrOrdinals[intProperty])))

                           {

                                // 将给定对象的属性值设置为给定值[即相应的空值]

                                objFieldInfo.SetValue(objObject, objValue);

                                continue;

                           }                          

     

                           // 如果无错误,赋值,设置下一个属性

                           try

                           {

                                // 将给定对象的属性值设置为给定值

                                objFieldInfo.SetValue(objObject, dr.GetValue(arrOrdinals[intProperty]));

                                continue;

                           }

                           catch

                           {

                           }

     

                           // 如果设置不成功

                           try

                           {

                                // 取得相应数据类型

                                objFieldType = objFieldInfo.FieldType;

     

                                // BaseType:获取当前 System.Type 直接从中继承的类型

                                // 如果类型不是枚举

                                if (!objFieldType.BaseType.Equals(typeof(System.Enum)))

                                {

                                     objFieldInfo.SetValue(objObject, Convert.ChangeType(dr.GetValue(arrOrdinals[intProperty]), objFieldType));

                                     continue;

                                }

     

                                // BaseType:获取当前 System.Type 直接从中继承的类型

                                // 如果类型是枚举

                                //  判断dr的第arrOrdinals[intProperty]格元素是不是数字

                                if (Information.IsNumeric(dr.GetValue(arrOrdinals[intProperty])))

                                {

                                     // 将给定对象的属性值设置为给定值 即第Convert.ToInt32(dr.GetValue(arrOrdinals[intProperty])个枚举值

                                     ((FieldInfo)objFields[intProperty]).SetValue(objObject, System.Enum.ToObject(objFieldType, Convert.ToInt32(dr.GetValue(arrOrdinals[intProperty]))));

                                }

                                else

                                {

                                     // 将给定对象的属性值设置为给定值

                                     ((FieldInfo)objFields[intProperty]).SetValue(objObject, System.Enum.ToObject(objFieldType,dr.GetValue(arrOrdinals[intProperty])));

                                }

                           }

                           catch

                           {

                                // 将给定对象的属性值设置为给定值

                                objFieldInfo.SetValue(objObject, Convert.ChangeType(dr.GetValue(arrOrdinals[intProperty]), objFieldType));

                           }

                       }

                  }

     

                  // 返回objObject对象

                  return objObject;

             }

     

             /// <summary>

             /// dr填充一个objType对象,并返回。

             /// </summary>

             /// <param name="dr">存储对象数据的DataReader</param>

             /// <param name="objType">对象类型</param>

             /// <returns>objType对象</returns>

             public static object FillObjectByField(IDataReader dr, Type objType)

             {

                  return FillObjectByField(dr, objType, true);

             }

     

             /// <summary>

             /// dr填充一个objType对象,并返回。

             /// </summary>

             /// <param name="dr">存储对象数据的DataReader</param>

             /// <param name="objType">对象类型</param>

             /// <param name="ManageDataReader"></param>

             /// <returns>objType对象</returns>

             public static object FillObjectByField(IDataReader dr, Type objType, bool ManageDataReader)

             {

                  object objFillObject;

     

                  // GetPropertyInfo:返回存储某类型的所有属性的集合。

                  // 取得属性集合

                  ArrayList objFields = GetFieldInfo(objType);

     

                  // GetOrdinals:返回dr属性字段索引的数组。

                  // 返回索引数组

                  int[] arrOrdinals = GetOrdinalsForField(objFields, dr);

     

                  bool Continue = true;

     

                  // 要不要继续,如果dr不到最后,继续

                  if (ManageDataReader)

                  {

                       Continue = false;

     

                       if (dr.Read())

                       {

                           Continue = true;

                       }

                  }

     

                  if (Continue)

                  {

                       // CreateObject:给objType类型的对象逐个赋值并返回。

                       objFillObject = CreateObjectByField(objType, dr, objFields, arrOrdinals);

                  }

                  else

                  {

                       objFillObject = null;

                  }

     

                  if (ManageDataReader)

                  {

                       if (dr != null)

                       {

                           dr.Close();

                       }

                  }

     

                  // 返回对象

                  return objFillObject;

             }

     

             /// <summary>

             /// dr填充一个objType对象数组,并返回。

             /// </summary>

             /// <param name="dr">存储对象数据的DataReader</param>

             /// <param name="objType">对象类型</param>

             /// <returns>对象数组</returns>

             public static ArrayList FillConllectionByField(IDataReader dr, Type objType)

             {

                  // 一个集合

                  ArrayList objFillCollection = new ArrayList();

                  object objFillObject;

     

                  // GetPropertyInfo:返回存储某类型的所有属性的集合。

                  // 取得objType/接口的属性集合

                  ArrayList objFields = GetFieldInfo(objType);

     

                  // GetOrdinals:返回dr属性字段索引的数组。

                  // 返回索引数组

                  int[] arrOrdinals = GetOrdinalsForField(objFields, dr);

     

                  // 生成多个objType对象

                  while(dr.Read())

                  {

                       objFillObject = CreateObjectByField(objType, dr, objFields, arrOrdinals);

                       objFillCollection.Add(objFillObject);

                  }

     

                  if (dr != null)

                  {

                       dr.Close();

                  }

     

                  // 返回对象数组

                  return objFillCollection;

             }

     

             /// <summary>

             /// dr填充一个IList,并返回。

             /// </summary>

             /// <param name="dr">存储对象数据的DataReader</param>

             /// <param name="objType">对象类型</param>

             /// <param name="objToFill">IList</param>

             /// <returns>IList</returns>

             public static IList FillCollectionByField(IDataReader dr, Type objType, IList objToFill)

             {

                  object objFillObject;

     

                  // GetPropertyInfo:返回存储某类型的所有属性的集合。

                  // 取得objType/接口的属性集合

                  ArrayList objFields = GetFieldInfo(objType);

     

                  // GetOrdinals:返回dr属性字段索引的数组。

                  // 返回索引数组

                  int[] arrOrdinals = GetOrdinalsForField(objFields, dr);

     

                  // 生成多个objType对象

                  while (dr.Read())

                  {

                       objFillObject = CreateObjectByField(objType, dr, objFields, arrOrdinals);

                       objToFill.Add(objFillObject);

                  }

     

                  if (dr != null)

                  {

                       dr.Close();

                  }

     

                  // 返回IList

                  return objToFill;

             }

     

     

         }

    }

     

    Null:存储某类型数据为空时的值。

    using System;

    using System.Reflection;

     

    namespace DOCNET.Utils

    {

         /// <summary>

         /// Null 的摘要说明。

         /// </summary>

         public class Null

         {

             public Null()

             {

                  //

                  // TODO: 在此处添加构造函数逻辑

                  //

             }

             public static short NullShort

             {

                  get

                  {

                       return -1;

                  }

             }

     

             public static int NullInteger

             {

                  get

                  {

                       return -1;

                  }

             }

     

             public static Single NullSingle

             {

                  get

                  {

                       return Single.MinValue;

                  }

             }

     

             public static double NullDouble

             {

                  get

                  {

                       return double.MinValue;

                  }

             }

     

             public static decimal NullDecimal

             {

                  get

                  {

                       return decimal.MinValue;

                  }

             }

     

             public static DateTime NullDate

             {

                  get

                  {

                       return DateTime.MinValue;

                  }

             }

     

             public static string NullString

             {

                  get

                  {

                       return "";

                  }

             }

     

             public static bool NullBoolean

             {

                  get

                  {

                       return false;

                  }

             }

     

             public static Guid NullGuid

             {

                  get

                  {

                       return Guid.Empty;

                  }

             }

     

             public static object SetNull(object objValue, object objField)

             {

                  object ret;

                  if (objValue is DBNull)

                  {

                       if (objField is short)

                       {

                           ret = NullShort;

                       }

                       else if (objField is int)

                       {

                           ret = NullInteger;

                       }

                       else if (objField is Single)

                       {

                           ret = NullSingle;

                       }

                       else if (objField is double)

                       {

                           ret = NullDouble;

                       }

                       else if (objField is decimal)

                       {

                           ret = NullDecimal;

                       }

                       else if (objField is DateTime)

                       {

                           ret = NullDate;

                       }

                       else if (objField is string)

                       {

                           ret = NullString;

                       }

                       else if (objField is bool)

                       {

                            ret = NullBoolean;

                       }

                       else if (objField is Guid)

                       {

                           ret = NullGuid;

                       }

                       else

                       {

                           ret = null;

                       }

                  }

                  else

                  {

                       ret = objValue;

                  }

     

                  return ret;

             }

     

             public static object SetNull(PropertyInfo objPropertyInfo)

             {

                  object ret;

                  switch (objPropertyInfo.PropertyType.ToString())

                  {

                       case "System.Int16":

                           ret = NullShort;

                           break;

                       case "System.Int32":

                       case "System.Int64":

                           ret = NullInteger;

                           break;

                       case "System.Single":

                           ret = NullSingle;

                           break;

                       case "System.Double":

                           ret = NullDouble;

                           break;

                       case "System.Decimal":

                           ret = NullDecimal;

                           break;

                       case "System.DateTime":

                           ret = NullDate;

                           break;

                       case "System.String":

                       case "System.Char":

                           ret = NullString;

                           break;

                       case "System.Boolean":

                           ret = NullBoolean;

                           break;

                       case "System.Guid":

                           ret = NullGuid;

                           break;

                       default:

                           Type pType = objPropertyInfo.PropertyType;

                           if (pType.BaseType.Equals(typeof(System.Enum)))

                           {

                                Array objEnumValues = Enum.GetValues(pType);

                                Array.Sort(objEnumValues);

                                ret = Enum.ToObject(pType, objEnumValues.GetValue(0));

                           }

                           else

                           {

                                ret = null;

                           }

                           break;

                  }

                  return ret;

             }

     

     

             public static object SetNull(FieldInfo objFieldInfo)

             {

                  object ret;

                  switch (objFieldInfo.FieldType.ToString())

                  {

                       case "System.Int16":

                           ret = NullShort;

                           break;

                       case "System.Int32":

                       case "System.Int64":

                           ret = NullInteger;

                           break;

                       case "System.Single":

                           ret = NullSingle;

                           break;

                       case "System.Double":

                           ret = NullDouble;

                           break;

                       case "System.Decimal":

                           ret = NullDecimal;

                           break;

                       case "System.DateTime":

                           ret = NullDate;

                           break;

                       case "System.String":

                       case "System.Char":

                           ret = NullString;

                           break;

                       case "System.Boolean":

                           ret = NullBoolean;

                           break;

                       case "System.Guid":

                           ret = NullGuid;

                           break;

                       default:

                           Type pType = objFieldInfo.FieldType;

                           if (pType.BaseType.Equals(typeof(System.Enum)))

                           {

                                Array objEnumValues = Enum.GetValues(pType);

                                Array.Sort(objEnumValues);

                                ret = Enum.ToObject(pType, objEnumValues.GetValue(0));

                           }

                           else

                           {

                                ret = null;

                           }

                           break;

                  }

                  return ret;

             }

     

     

             public static object GetNull(object objField, object objDBNull)

             {

                  object ret = objField;

                  if (objField == null)

                  {

                       ret = objDBNull;

                  }

                  else if (objField is short)

                  {

                       if (Convert.ToInt16(objField) == NullShort)

                       {

                           ret = objDBNull;

                       }

                  }

                  else if (objField is int)

                  {

                       if (Convert.ToInt32(objField) == NullInteger)

                       {

                           ret = objDBNull;

                       }

                  }

                  else if (objField is Single)

                  {

                       if (Convert.ToSingle(objField) == NullSingle)

                       {

                           ret = objDBNull;

                       }

                  }

                  else if (objField is double)

                  {

                       if (Convert.ToDouble(objField) == NullDouble)

                       {

                           ret = objDBNull;

                       }

                  }

                  else if (objField is decimal)

                  {

                       if (Convert.ToDecimal(objField) == NullDecimal)

                       {

                           ret = objDBNull;

                       }

                  }

                  else if (objField is DateTime)

                  {

                       if (Convert.ToDateTime(objField) == NullDate.Date)

                       {

                           ret = objDBNull;

                       }

                  }

                  else if (objField is string)

                  {

                       if (objField == null)

                       {

                           ret = objDBNull;

                       }

                  }

                  else if (objField is bool)

                  {

                       if (Convert.ToBoolean(objField) == NullBoolean)

                       {

                           ret = objDBNull;

                       }

                  }

                  else if (objField is Guid)

                  {

                       if (((Guid)objField).Equals(NullGuid))

                       {

                           ret = objDBNull;

                       }

                  }

     

                  return ret;

             }

     

             public static bool IsNull(object objField)

             {

                  bool ret;

                  if (objField != null)

                  {

                       if (objField is int)

                       {

                           ret = objField.Equals(NullInteger);

                       }

                       else if (objField is Single)

                       {

                           ret = objField.Equals(NullSingle);

                       }

                       else if (objField is double)

                       {

                           ret = objField.Equals(NullDouble);

                       }

                       else if (objField is decimal)

                       {

                           ret = objField.Equals(NullDecimal);

                       }

                       else if (objField is DateTime)

                       {

                           DateTime objDate = Convert.ToDateTime(objField);

                           ret = objDate.Equals(NullInteger);

                       }

                       else if (objField is string)

                       {

                           ret = objField.Equals(NullString);

                       }

                       else if (objField is bool)

                       {

                           ret = objField.Equals(NullBoolean);

                       }

                       else if (objField is Guid)

                       {

                           ret = objField.Equals(NullGuid);

                       }

                       else

                       {

                           ret = false;

                       }

                  }

                  else

                  {

                       ret = true;

                  }

                  return ret;

             }

         }

    }

     

     

    后记:

    这是在看DNN时,看到的两个类: NullCBO。总觉得DB类中的Get方法是一个比较麻烦的方法,空数据也比较令人头痛,有了这两个类,可能会对这两个方面有帮助。

  • 相关阅读:
    GitHub 教程【转】
    Github 教程
    Excel 多个单元格输入同样内容
    寻找问题远比解决问题重要!
    蒲公英: 一个提供App 存储、分发、Bug管理的网站
    Dacapao 实验集(9.12 版本) 能不能给个网址?【内存分析实验】
    软件测试思维导图[ZZ]
    程序员、技术领导、管理者各有烦恼,你占了几条?ZZ
    r test
    mooctest项目总结 【转载】
  • 原文地址:https://www.cnblogs.com/admin11/p/210915.html
Copyright © 2020-2023  润新知