/// ----------------------------------------------------------------------------- /// <summary> /// Generic version of CreateObject creates an object of a specified type from the /// provided DataRow /// </summary> /// <typeparam name="T">The type of the business object</typeparam> /// <param name="dr">The DataRow</param> /// <returns>The custom business object</returns> /// <remarks></remarks> /// ----------------------------------------------------------------------------- private static T CreateObject <T>(DataRow dr) { PropertyInfo objPropertyInfo; object objValue; Type objPropertyType = null; int intProperty; T objObject = Activator.CreateInstance <T>(); ArrayList objProperties = GetPropertyInfo(objObject.GetType()); for (intProperty = 0; intProperty <= objProperties.Count - 1; intProperty++) { objPropertyInfo = (PropertyInfo)objProperties[intProperty]; if (objPropertyInfo.CanWrite) { objValue = Null.SetNull(objPropertyInfo); try { if (System.Convert.IsDBNull(dr[objPropertyInfo.Name])) { objPropertyInfo.SetValue(objObject, objValue, null); } else { try { objPropertyInfo.SetValue(objObject, dr[objPropertyInfo.Name], null); } catch { try { objPropertyType = objPropertyInfo.PropertyType; if (objPropertyType.BaseType.Equals(typeof(System.Enum))) { int testint = 0; if (testint.GetType() == dr[objPropertyInfo.Name].GetType()) { ((PropertyInfo)objProperties[intProperty]).SetValue(objObject, System.Enum.ToObject(objPropertyType, Convert.ToInt32(dr[objPropertyInfo.Name])), null); } else { ((PropertyInfo)objProperties[intProperty]).SetValue(objObject, System.Enum.ToObject(objPropertyType, dr[objPropertyInfo.Name]), null); } } else { objPropertyInfo.SetValue(objObject, Convert.ChangeType(dr[objPropertyInfo.Name], objPropertyType), null); } } catch { objPropertyInfo.SetValue(objObject, Convert.ChangeType(dr[objPropertyInfo.Name], objPropertyType), null); } } } } catch { objPropertyInfo.SetValue(objObject, objValue, null); } } } return(objObject); }
/// <summary> /// Return object based on parameters. /// </summary> /// <param name="objType">Type od datatype.</param> /// <param name="dr">The DataReader</param> /// <param name="objProperties">ArrayList</param> /// <param name="arrOrdinals">Array of integer.</param> /// <returns>Object</returns> private static object CreateObject(Type objType, IDataReader dr, ArrayList objProperties, int[] arrOrdinals) { PropertyInfo objPropertyInfo; object objValue; Type objPropertyType = null; int intProperty; //objPropertyInfo.ToString() == BuiltyNumber object objObject = Activator.CreateInstance(objType); // fill object with values from datareader for (intProperty = 0; intProperty <= objProperties.Count - 1; intProperty++) { objPropertyInfo = (PropertyInfo)objProperties[intProperty]; if (objPropertyInfo.CanWrite) { objValue = Null.SetNull(objPropertyInfo); if (arrOrdinals[intProperty] != -1) { if (System.Convert.IsDBNull(dr.GetValue(arrOrdinals[intProperty]))) { // translate Null value objPropertyInfo.SetValue(objObject, objValue, null); } else { try { // try implicit conversion first objPropertyInfo.SetValue(objObject, dr.GetValue(arrOrdinals[intProperty]), null); } catch { // business object info class member data type does not match datareader member data type try { objPropertyType = objPropertyInfo.PropertyType; //need to handle enumeration conversions differently than other base types if (objPropertyType.BaseType.Equals(typeof(System.Enum))) { // check if value is numeric and if not convert to integer ( supports databases like Oracle ) int test = 0; if (test.GetType() == dr.GetValue(arrOrdinals[intProperty]).GetType()) { ((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); } } else if (objPropertyType.FullName.Equals("System.Guid")) { // guid is not a datatype common across all databases ( ie. Oracle ) objPropertyInfo.SetValue(objObject, Convert.ChangeType(new Guid(dr.GetValue(arrOrdinals[intProperty]).ToString()), objPropertyType), null); } else { // try explicit conversion objPropertyInfo.SetValue(objObject, Convert.ChangeType(dr.GetValue(arrOrdinals[intProperty]), objPropertyType), null); } } catch { objPropertyInfo.SetValue(objObject, Convert.ChangeType(dr.GetValue(arrOrdinals[intProperty]), objPropertyType), null); } } } } else { // property does not exist in datareader } } } return(objObject); }
/// ----------------------------------------------------------------------------- /// <summary> /// Generic version of CreateObject creates an object of a specified type from the /// provided DataReader /// </summary> /// <typeparam name="T">The type of the business object</typeparam> /// <param name="dr">The DataReader</param> /// <returns>The custom business object</returns> /// <remarks></remarks> /// <history> /// [cnurse] 10/10/2005 Created /// </history> /// ----------------------------------------------------------------------------- private static T CreateObject <T>(IDataReader dr) { PropertyInfo objPropertyInfo; object objValue; Type objPropertyType = null; int intProperty; T objObject = Activator.CreateInstance <T>(); // get properties for type ArrayList objProperties = GetPropertyInfo(objObject.GetType()); // get ordinal positions in datareader int[] arrOrdinals = GetOrdinals(objProperties, dr); // fill object with values from datareader for (intProperty = 0; intProperty <= objProperties.Count - 1; intProperty++) { objPropertyInfo = (PropertyInfo)objProperties[intProperty]; if (objPropertyInfo.CanWrite) { objValue = Null.SetNull(objPropertyInfo); if (arrOrdinals[intProperty] != -1) { if (System.Convert.IsDBNull(dr.GetValue(arrOrdinals[intProperty]))) { // translate Null value objPropertyInfo.SetValue(objObject, objValue, null); } else { try { // try implicit conversion first objPropertyInfo.SetValue(objObject, dr.GetValue(arrOrdinals[intProperty]), null); } catch { // business object info class member data type does not match datareader member data type try { objPropertyType = objPropertyInfo.PropertyType; //need to handle enumeration conversions differently than other base types if (objPropertyType.BaseType.Equals(typeof(System.Enum))) { // check if value is numeric and if not convert to integer ( supports databases like Oracle ) int testint = 0; if (testint.GetType() == dr.GetValue(arrOrdinals[intProperty]).GetType()) { ((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); } } else { // try explicit conversion objPropertyInfo.SetValue(objObject, Convert.ChangeType(dr.GetValue(arrOrdinals[intProperty]), objPropertyType), null); } } catch { objPropertyInfo.SetValue(objObject, Convert.ChangeType(dr.GetValue(arrOrdinals[intProperty]), objPropertyType), null); } } } } else { // property does not exist in datareader } } } return(objObject); }